Grundlagen der Programmiersprache C
uint8_t a = 0x0F;
if (~a == 0xF0)
printf("equal\n");
else
printf("not equal\n");uint8_t sei ein vorzeichenloser 8-Bit-Ganzzahltyp und int habe 32 Bit. Was ergibt die Ausführung des obigen Codes?
- Aequal wird ausgegeben
- BAuf uint8_t-Werte kann ~ nicht angewendet werden, daher entsteht ein Kompilierfehler
- Cnot equal wird ausgegeben
Antwort und Erläuterung anzeigen
Antwort: C. not equal wird ausgegeben
Bevor ~a berechnet wird, wandelt die Integer-Promotion a in den int-Wert 0x0000000F um. ~a ist daher nicht der 8-Bit-Wert 0xF0, sondern der 32-Bit-Wert 0xFFFFFFF0 (als int −16) und nicht gleich 0xF0 (240). Soll mit 8 Bit verglichen werden, wird vor dem Vergleich in einen 8-Bit-Typ zurückgewandelt, etwa mit (uint8_t)~a == 0xF0. Dieser Fehler passiert leicht, wenn ein Registerwert invertiert und verglichen wird.
Weiter: 9 weitere Fragen zu Grundlagen der Programmiersprache C