Ich versuche einen Test zu machen, um zu sagen, ob mein PC arithmetische oder logische Rechtsverschiebung durch Rechtsverschiebung hexadezimal FFFFFFFF
von 1
ausführt.Warum erzeugen -1 >> 1 und 0xFFFFFFFF >> 1 unterschiedliche Ergebnisse?
Ich weiß, dass eine ganze Zahl -1
als FFFFFFFF
in hexadezimale liest, da es das Komplement ist zwei 1
. Right-shifting -1
von 1
Ergebnisse in FFFFFFFF
und zeigt den PC arithmetische Rechtsverschiebung durchgeführt.
Aber wenn ich nur 0xFFFFFFFF >> 1
eintippe, ergab es 7FFFFFFF
und zeigt, dass der PC logische Rechtsverschiebung statt. Warum ist das passiert? Sehen Sie den Code unten, dass die Ergebnisse produziert:
#include <stdlib.h>
#include <stdio.h>
int main (int argc, char *argv[])
{
printf ("%x >> 1 = %x\n", -1, -1 >> 1);
printf ("%x >> 1 = %x\n", 0xffffffff, 0xffffffff >> 1);
return EXIT_SUCCESS;
}
Die Ausgabe des Programms war:
ffffffff >> 1 = ffffffff
ffffffff >> 1 = 7fffffff
'-1' ist signiert. '0xffffffff' ist nicht signiert. Es hat nichts mit 'printf()' zu tun. – chux
Rechtsverschiebung negative vorzeichenbehaftete Werte ist die Implementierung definiert: '-1 >> 1 'könnte auch als' 7fffffff 'drucken. – chqrlie