C Vergleich von Variablen und Konstantenwerten nicht übereinstimmend

8

Wenn ich:

%Vor%

und ich vergleiche:

%Vor%

es wird niemals 0XFF fangen, aber wenn ich es durch -1 ersetze, wird es:

%Vor%

Wie kann das passieren? Ist es etwas mit der Zeichenflagge? Ich habe das 0xFF == -1 == 255 .

    
CiNN 14.09.2008, 09:29
quelle

4 Antworten

29

Der Wert 0xFF ist ein vorzeichenbehafteter int-Wert. C wird die *p zu einem int hochstufen, wenn der Vergleich durchgeführt wird, also entspricht die erste if-Anweisung:

%Vor%

was natürlich falsch ist. Mit (signed char)0xFF entspricht die Anweisung:

%Vor%

was wie erwartet funktioniert. Der entscheidende Punkt hier ist, dass der Vergleich mit int types statt signed char types durchgeführt wird.

    
Greg Hewgill 14.09.2008, 09:33
quelle
4

Integer-Literale haben einen int-Typ. Da 0xFF ein vorzeichenbehafteter int ist, konvertiert der Compiler * p in einen vorzeichenbehafteten int und führt dann den Vergleich durch.

Wenn * p -1 ist und dann von einem vorzeichenbehafteten Zeichen in ein vorzeichenbehaftetes int konvertiert wird, ist es immer noch -1, das eine Darstellung von 0xFFFFFFFF hat, die ungleich 0xFF ist.

    
Niall 14.09.2008 09:38
quelle
2

Es wird für den ersten Vergleich in ein int umgewandelt, da 0xFF immer noch als int betrachtet wird, was bedeutet, dass Ihr char -128 bis 127 ist, aber das 0xFF ist immer noch 255.

Im zweiten Fall sagt Ihr, dass 0xFF wirklich ein signiertes Zeichen ist, kein int

    
Fire Lancer 14.09.2008 09:34
quelle
1

0xff wird als Integer-Konstante mit dem Wert 255 angezeigt. Sie sollten diese Art des Vergleichs zwischen verschiedenen Typen immer beachten. Wenn Sie sicher sein wollen, dass der Compiler den richtigen Code generiert, sollten Sie die Typumwandlung verwenden:

%Vor%

Wie auch immer, Vorsicht , dass die nächste Anweisung nicht funktioniert auf die gleiche Weise:

%Vor%

Vielleicht ist es auch besser, signierte Zeichen zu vermeiden, oder Sie müssen signierte Zeichen verwenden, um sie in diesem Fall mit vorzeichenbehafteten Werten wie -1 zu vergleichen:

%Vor%

0xff == - 1 nur, wenn diese Werte einigen char (oder unsigned char) Variablen zugewiesen werden:

%Vor%     
botismarius 14.09.2008 09:42
quelle

Tags und Links