main() {
if (-1 < (unsigned char) 1)
printf("less than");
else
printf("NOT less than");
}
Drucke less than
. Weil (unsigned char) 1
in(signed char) 1
konvertiert wird und dann: (signed) -1 < (signed) 1
, so ist Ausgabe less than
.Dateityppromotions während arithmetischer Operationen: -1 <(unsinged int) 1 == falsch
Aber wenn ich den obigen Code-if ((-1 < (unsigned int) 1)
ändern, dann ist der Ausgang NOT less than
.
Es ist so offensichtlich, dass, wenn ich unsigned char unsigned int ändern:
- (signiert) -1 in unsigned int umgewandelt wird [genau gegenüber geschieht]
- da -1 gespeichert als 2 Kompliment von 1; das Bitmuster wird als 255 (wahrscheinlich)
- ausgewertet, also wird 255 < 1 zu false ausgewertet und wird sonst ausgeführt.
- auch wenn Sie
int a = -1;
anstelle von ‚-1‘ gleiches Ergebnis
Fragen ersetzen:
während und ohne Vorzeichen Arithmetik ... wie sicher sein, wenn umgewandelt wird unterzeichnet unsigniert oder umgekehrt.
warum ist die Umwandlung verschiedener für die Arithmetik zwischen unsigned char und char: anscheinend nicht signiert und ohne Vorzeichen int umgewandelt und int: anscheinend unterzeichnet ist Konverter unsigned
PS: Ich weiß, dass dies nicht Compiler abhängig..so sage nicht, dass es ist.
sind nicht alle Literale Standard Int? (unsigned char -> int promotion gegen int -> unsigned int promotion) – flownt