main() {
if ( -1 < (unsigned char) 1 )
printf("less than");
else
printf("NOT less than");
}
Drucke less than
. Weil, (unsigned char) 1
wird umgewandelt in (signed char) 1
und dann: (signed) -1 < (signed) 1
Die Ausgabe ist also less than
.
Aber wenn ich den obigen Code ändere a if ( (-1 < (unsigned int) 1 )
dann lautet die Ausgabe NOT less than
.
Es ist also offensichtlich, dass, wenn ich unsigned char zu unsigned int:
- (vorzeichenbehaftet) -1 wird in unsigned int umgewandelt [genau das Gegenteil passiert].
- da -1 als 2er-Komplement von 1 gespeichert wird; das Bitmuster wird (wahrscheinlich) als 255 ausgewertet
- Somit wird 255 < 1 zu false ausgewertet und else ausgeführt.
- auch wenn Sie die
int a = -1;
anstelle von '-1' dasselbe Ergebnis
Fragen:
-
bei vorzeichenbehafteter und vorzeichenloser Arithmetik...wie kann man sicher sein, dass vorzeichenbehaftete in vorzeichenlose Zahlen umgewandelt werden oder umgekehrt.
-
Warum ist die Konvertierung für die Arithmetik zwischen unsigned char und char unterschiedlich: unsigned wird offenbar in signed umgewandelt und unsigned int und int: signed wird offenbar in unsigned umgewandelt
PS: Ich weiß, dass dies nicht compilerabhängig ist, also sagen Sie nicht, dass es das ist.