-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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.