Basis van programmeren in C

uint8_t a = 0x0F;
if (~a == 0xF0)
    printf("equal\n");
else
    printf("not equal\n");

uint8_t is een 8-bits integertype zonder teken en int is 32 bits. Wat is het resultaat als de bovenstaande code wordt uitgevoerd?

  1. Aequal wordt afgedrukt
  2. BEr ontstaat een compileerfout, omdat ~ niet op een waarde van het type uint8_t mag worden toegepast
  3. Cnot equal wordt afgedrukt
Antwoord en toelichting tonen

Antwoord: C. not equal wordt afgedrukt

Voordat ~a wordt berekend, wordt a door integerpromotie omgezet naar de int 0x0000000F. Daardoor is ~a niet de 8-bits waarde 0xF0, maar de 32-bits waarde 0xFFFFFFF0 (als int −16), en die is niet gelijk aan 0xF0 (240). Om in 8 bits te vergelijken, wordt eerst teruggezet naar een 8-bits type, zoals in (uint8_t)~a == 0xF0. Deze fout komt vaak voor bij het inverteren en vergelijken van registerwaarden.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Basis van programmeren in C

  1. int en unsigned int zijn 32 bits. Wat is het resultaat als de bovenstaande code wordt uitgevoerd?
  2. unsigned int is 32 bits. Welke beschrijving van het gedrag bij het uitvoeren van de bovenstaande code is juist?
  3. Een programma dat „char c = 200;” instelt en c met %d in printf afdrukt, gaf −56 na compileren en uitvoeren met gcc voor Linux op x86-64, en 200 met gcc voor Linux op Arm. Wat is de reden voor dit verschil?
  4. Wat is de uitvoer als de bovenstaande code, met b++ aan de rechterkant van && en ||, wordt uitgevoerd?
  5. Wat is de uitvoer als het bovenstaande switch-statement, met een case zonder break, wordt uitgevoerd?