Ich habe den folgenden Code in dem Buch Computer Systems gesehen: Eine Perspektive des Programmierers, 2/E. Dies funktioniert gut und erzeugt die gewünschte Ausgabe. Die Ausgabe kann durch die Differenz von Vorzeichen und Vorzeichen erklärt werden.Was ist der Unterschied zwischen Literalen und Variablen in C (signed vs unsigned short ints)?
#include<stdio.h>
int main() {
if (-1 < 0u) {
printf("-1 < 0u\n");
}
else {
printf("-1 >= 0u\n");
}
return 0;
}
Der obige Code Ausbeuten -1 >= 0u
, der folgende Code jedoch, die die gleichen wie oben sein soll, nicht! Mit anderen Worten,
#include <stdio.h>
int main() {
unsigned short u = 0u;
short x = -1;
if (x < u)
printf("-1 < 0u\n");
else
printf("-1 >= 0u\n");
return 0;
}
ergibt -1 < 0u
. Warum ist das passiert? Ich kann das nicht erklären.
Beachten Sie, dass ich ähnliche Fragen wie this gesehen habe, aber sie helfen nicht.
PS. Wie @Abhineet sagte, kann das Dilemma gelöst werden, indem man short
zu int
ändert. Wie aber kann man dieses Phänomen erklären? Mit anderen Worten, -1
in 4 Bytes ist 0xff ff ff ff
und in 2 Bytes ist 0xff ff
. Sind sie als 2s-Komplement angegeben, die als unsigned
interpretiert werden, haben sie entsprechende Werte von 4294967295
und 65535
. Sie beide sind nicht weniger als 0
und ich denke, in beiden Fällen muss die Ausgabe -1 >= 0u
sein, d. H. x >= u
.
Eine Beispielausgabe für sie auf ein Little-Endian-Intel-System:
kurz:
-1 < 0u
u =
00 00
x =
ff ff
Für int:
-1 >= 0u
u =
00 00 00 00
x =
ff ff ff ff
[Ähnliche Frage] (http://stackoverflow.com/questions/17312545/type-conversion-unsigned-to-signed-int-char). – Lundin
C verhält sich in Bezug auf * Werte *, nicht Darstellungen. All das Zeug über das Zweierkomplement und ffff und 65535 usw. ist irrelevant. –
Verwenden Sie keine Codeformatierung für Text, der kein Code ist. – EJP