c / expert
Snippet
Implizite Ganzzahl-Promotion und das bitweise NICHT
In C lösen arithmetische Operationen auf Typen, die kleiner als 'int' sind (wie char oder short), eine 'Ganzzahl-Promotion' aus, bei der der Operand zuerst in ein 'int' konvertiert wird. Das Ausführen eines bitweisen NICHT (~) auf ein unsigned char 0xFF ergibt ein int (typischerweise 0xFFFFFF00 auf 32-Bit-Systemen) anstelle von 0x00, was eine häufige Fehlerquelle bei der hardwarenahen Bit-Manipulation ist.
snippet.c
1
2
3
4
5
6
unsigned char val = 0xFF;if (~val == 0) {// This block will NOT execute} else if ((unsigned char)~val == 0) {// This block WILL execute}
Erklärung
1
~val == 0
Das heraufgestufte 'val' (0x000000FF) wird nach der Invertierung zu (0xFFFFFF00), was nicht Null entspricht.
2
(unsigned char)~val
Das Zurück-Casten auf unsigned char schneidet das Ergebnis auf 8 Bit ab, was 0x00 ergibt.