2012-04-09 10 views
3

In diesem kleinen Programm:Warum gibt dieser Vergleich false zurück?

#include <unistd.h> 
#include <stdint.h> 
#include <stdio.h> 

int main() { 
    uint8_t a = 0; 
    uint8_t b = 255; 

    if (a == (b + 1)) { 
     printf("Equal\n"); 
    } else { 
     printf("Not equal\n"); 
    } 

    if (a == ((b + 1) & 0xFF)) { 
     printf("Equal\n"); 
    } else { 
     printf("Not equal\n"); 
    }  
} 

ich:

Not Equal 
Equal 

Warum 8 Bits nicht der Vergleich der Arbeit, es sei denn ich nehme gewaltsam die letzten? Ich vermute, dass mir hier etwas Nuance von vorzeichenloser Arithmetik fehlt ...

Ich benutze gcc 4.4.5, wenn das einen Unterschied macht.

Antwort

8

Aufgrund von Integer-Promotions werden beide Operanden des Operators == und + zu int befördert.

der Ausdruck:

a == (b + 1) 

ist dann äquivalent zu:

0 == 256 

welche falsch ist.

Der Ausdruck: a == (uint8_t) (b + 1) würde Ihnen das Ergebnis geben, das Sie erwarten (wahr). Eine weitere Lösung ist & 0xFF wie in Ihrer zweiten if Anweisung zu verwenden,

+0

Aha, davon hatte ich noch nie gehört, das würde es tun. –

+5

Es sind nicht die Operanden von '==' das ist wichtig, es sind die von '+'. –

+0

Ich hätte das niemals erraten! Guter Gedanke. – HWende

2

1 eine ganze Zahl ist, so wird der Ausdruck zu int gefördert. Bei diesem Typ wird der Vergleich 0 == 256. Im anderen Fall erzwingen Sie die und mit nur den 8 Ziffern, so dass der Vergleich gilt.

Verwandte Themen