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?

  1. Aequal wird ausgegeben
  2. BAuf uint8_t-Werte kann ~ nicht angewendet werden, daher entsteht ein Kompilierfehler
  3. 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.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Grundlagen der Programmiersprache C

  1. int und unsigned int haben 32 Bit. Was ergibt die Ausführung des obigen Codes?
  2. unsigned int habe 32 Bit. Wie verhält sich der obige Code bei der Ausführung?
  3. Ein Programm, das c aus „char c = 200;“ mit %d von printf ausgibt, zeigt nach dem Kompilieren mit gcc für Linux auf x86-64 den Wert −56, mit gcc für Linux auf Arm dagegen 200. Was ist der Grund für den Unterschied?
  4. Welche Ausgabe erzeugt der obige Code, in dem b++ rechts von && und || steht, bei der Ausführung?
  5. Welche Ausgabe erzeugt die obige switch-Anweisung, die ein case ohne break enthält, bei der Ausführung?