Heim >Backend-Entwicklung >C++ >Was passiert, wenn Sie eine vorzeichenlose Ganzzahl nach rechts verschieben, wobei die Anzahl der Verschiebungen ihre Breite überschreitet?
Rechtsverschiebungsverhalten bei Überschreitung der Anzahl
Es stellt sich die Frage nach dem Verhalten einer Rechtsverschiebungsoperation in C, wenn die Verschiebungsanzahl die Breite überschreitet des Datentyps. Gemäß dem C-Standard sollte die Rechtsverschiebung eines vorzeichenlosen Werts mit einer nicht negativen Zählung zum Integralquotienten des ursprünglichen Werts dividiert durch 2^E2 führen. Der Benutzer beobachtete jedoch unerwartetes Verhalten mit GCC auf der Intel-Plattform.
Das Problem ergibt sich aus der Tatsache, dass der C-Standard angibt, dass das Verhalten undefiniert ist, wenn der rechte Operand (Shift-Anzahl) größer oder gleich dem ist Breite des heraufgestuften linken Operanden (Datenwert, der verschoben wird). Da unsigned int in der Regel 32 Bit oder weniger beträgt, gilt in diesem Fall eine Verschiebungsanzahl von 34 als undefiniertes Verhalten.
GCCs Warnung „Right Shift Count >= width of type“ weist auf dieses undefinierte Verhalten hin. Der resultierende Wert von 67108863, der im Assembler-Code beobachtet wird, bestätigt dies ebenfalls. Daher liegt das Problem nicht in der Implementierung des Standards durch GCC, sondern vielmehr im undefinierten Verhalten, das durch das Überschreiten der Datentypbreite bei der Schiebeoperation verursacht wird.
Das obige ist der detaillierte Inhalt vonWas passiert, wenn Sie eine vorzeichenlose Ganzzahl nach rechts verschieben, wobei die Anzahl der Verschiebungen ihre Breite überschreitet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!