Heim > Artikel > Backend-Entwicklung > Warum führt 1 >> 32 zu 1, 1 (uint64_t) >> 32 jedoch zu 0?
> 32 Ergebnis in 1, aber 1 (uint64_t) >> 32 Ergebnis in 0? " />
Problem:
In einem C-Programm die rechte Verschiebung Der Operator zeigt seltsames Verhalten:
<code class="cpp">int foo(int a, int b) { return a >> b; } int main() { std::cout << "foo(1, 32): " << foo(1, 32) << std::endl; }
Die Ausgabe ist 1, was unerwartet ist, da das Ergebnis theoretisch 0 sein sollte. Darüber hinaus unterscheidet sich das Verhalten je nach Argumenttyp:
<code class="cpp">int bar(uint64_t a, int b) { return a >> b; } std::cout << "bar(1, 32): " << bar(1, 32) << std::endl; // Outputs 0
Erklärung:
Dieses Verhalten ist auf die Tatsache zurückzuführen, dass der rechte Verschiebungsoperator je nach Breite des zugrunde liegenden Datentyps (in diesem Fall int) unterschiedlich funktioniert Die Rechtsverschiebung ist eine „logische“ Verschiebung, das heißt, sie füllt die frei gewordenen Bits unabhängig vom Wert von b mit Nullen auf. Daher wird 1 >> als 1 ausgewertet, da eine Verschiebung um mehr als die Anzahl der Bits keine Auswirkung hat.
Bei 64-Bit-Ganzzahlen (uint64_t) ist die Rechtsverschiebung jedoch eine „arithmetische“ Verschiebung, d. h. sie füllt die frei gewordenen Bits mit demselben Vorzeichenbit wie der Operand , das Ergebnis von 1 >> 32 ist 0.
Compiler-Optimierung:
Zusätzlich spielt die Optimierung des Compilers eine Rolle. Der Ausdruck 1 >> 32 ist eine Konstante zur Kompilierungszeit, die es dem Compiler ermöglicht, sie während der Kompilierung auf 0 zu reduzieren. Dies unterscheidet sich von der dynamischen Auswertung von foo(1, 32) innerhalb der Funktion.
Portabilitätsproblem:
Es ist wichtig zu beachten, dass dieses Verhalten architekturabhängig ist. Auf einigen Architekturen wie ARM wird die logische Rechtsverschiebung anders implementiert als auf x86/x86-64-CPUs. Daher kann das Verschieben einer 32-Bit-Ganzzahl um einen Wert größer oder gleich 32 zu nicht tragbaren Ergebnissen führen.
Das obige ist der detaillierte Inhalt vonWarum führt 1 >> 32 zu 1, 1 (uint64_t) >> 32 jedoch zu 0?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!