Forum: Compiler & IDEs -Wconversion


von Klemens (Gast)


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"

von Stefan E. (sternst)


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.

von Klemens (Gast)


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?

von Peter II (Gast)


Lesenswert?

Klemens schrieb:
> Aber arbeitet der gcc bei 8-Bit Controllern nicht standardmäßg mit char?

nein weil C int vorschreibt und int ist min 16bit.

von wörg (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.