Forum: Compiler & IDEs Merkwürdige Compilerwarnung bei XC8


von Mike (Gast)


Lesenswert?

Das Schieben einer 8-bit Zahl um 1 bit nach links müsste doch das 
Gleiche sein, wie eine Multiplikation mit 2:
1
unsigned char a,b,c;
2
a = 4;
3
b = a << 1;
4
c = a*2;   // c == b?
Die Zeile
1
b = a << 1;
 gibt mir jedoch eine Compilerwarnung:
warning: implicit conversion loses integer precision: 'int' to 'unsigned 
char' [-Wconversion],
1
c = a*2
 jedoch nicht. Anscheinend wird a << 1 in eine 16-bit Integer 
umgewandelt, bei der anschliessenden Zuweisung zu unsigned char kommt es 
zu der Warnung. Warum passiert das bei a*2 nicht?

von A. S. (Gast)


Lesenswert?

Naja, irgendwo muss man eine Grenze ziehen

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Mike schrieb:
> Warum passiert das bei a*2 nicht?

Vielleicht schnallt der Optimizer dort noch, dass 4 * 2 ohnehin in ein 
unsigned char passt.

Wie sieht die Situation denn aus, wenn die Variable a global (und damit 
der Wert unbekannt) ist?

von Teo D. (teoderix)


Lesenswert?

Umgekehrte Assoziativität.

von Blume (Gast)


Lesenswert?

Zusätlich geltem Konstanten, in dem Fall 4 1 2, als signed Werte.
Warum auch immer.

hier hilft ein U als Kennzeichnung, also 4U 1U und 2U

mfg

Blume
1
unsigned char a,b,c;
2
a = 4U;
3
b = a << 1U;
4
c = a*2U;   // c == b?

Achtung: Lokale Variablen mit 8Bit größe können sich auf 32Bit 
Kontrolern negativ  auswirken.

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.