-Wconversion

Gast #2988570
Lesenswert?

Hallo Gemeinde.

Ich experimentiere gerade mit den Compiler-Warnungen herum und habe bei 
-Wconversion ein Verständniss-Problem.

Folgenden Code habe ich:
1
1:   if ( fail > 2)
2
2:      PORTC |= ( 1 << PC3 );
3
3:   else
4
4:      PORTC &= ~( 1 << PC3 );

Jetzt wird in der Zeile 4 folgende Warnmeldung augegeben:
"conversion to 'uin8_t' from 'int' may alter its value"

Diese Meldung habe ich an vielen Stellen in meinem Projekt. Es scheinen 
aber nur die Zuweisungen mit einem "&=" bzw "&= ~()" zu sein, aber nicht 
"|=" Zuweisungen.

Kann mir das jemand erklären?

Ich verwende avr-gcc (WinAVR 20100110) 4.3.3

Compileroptionen:
avr-gcc -Wall -g2 -gstabs -Os -fpack-struct -fshort-enums -std=gnu99 
-funsigned-char -funsigned-bitfields -Wextra -Wshadow -Wconversion 
-Wswitch-default -Wswitch-enum -Wuninitialized -mmcu=atmega168 
-DF_CPU=20000000UL -MMD -MP -MF"tools/tools.d" -MT"tools/tools.d" -c -o 
"tools/tools.o" "../tools/tools.c"
#2988611
Lesenswert?

Klemens schrieb:
> Es scheinen
> aber nur die Zuweisungen mit einem "&=" bzw "&= ~()" zu sein

Ne, sicherlich nur die mit '~'.

Das Ergebnis des '~'-Operators ist ein int, im konkreten Fall nämlich 
1111111111110111. Durch die Zuweisung an ein uint8_t wird daraus 
11110111.

Das Ergebnis von "1 << PC3" (also ohne '~') ist zwar auch ein int, aber 
hier sind die oberen 8 Bits Nullen.
Gast #2988628
Lesenswert?

> Das Ergebnis des '~'-Operators ist ein int, im konkreten Fall nämlich
> 1111111111110111. Durch die Zuweisung an ein unit8_t wird daraus
> 11110111.
>
> Das Ergebnis von "1 << PC3" (also ohne '~') ist zwar auch ein int, aber
> hier sind die oberen 8 Bits Nullen.

Okay, das leuchtet ein.
Aber arbeitet der gcc bei 8-Bit Controllern nicht standardmäßg mit char?

Habe noch etwas gefunden:
1
ADMUX &= 0xf0;

und das hier:
1
unsigned char check = 0;
2
unsigned char data  = 0;
3

4
for ( unsigned int adress = 0; adress < FLASHEND; adress++)
5
{
6
   data = pgm_read_byte_near (adress);
7
   check += data;
8
}

hier kommt die Meldung bei "check += data".
Erkennt der Compiler auf einen möglichen Überlauf?
Gast #2991932
Lesenswert?

ich bezweifle, dass sich die option mit einem avr überhaupt sinnvoll 
verwenden lässt. am gcc ist doch so viel modifiziert worden, damit er 
mit 8bit keinen allzu schlimmen bloatcode erzeugt. daher könnte ich mir 
vorstellen, dass die option an vielen stellen nur fälschlicherweise 
meckert.
klarheit schafft nur ein blick ins assembler-listing.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren