C 中的
>`) 在移位 32 位元時會產生意外結果? " />
右移運算子的意外行為(1 >> 32)
在程式設計領域,右移運算子(>> 32) ) 通常用於執行位元運算,特別是用整數除以2 的冪,但是,當移位較大的值時,可能會出現奇怪的行為,如以下C 程式碼所示:
<code class="cpp">int foo(int a, int b) { return a >> b; } int bar(uint64_t a, int b) { return a >> b; } int main() { std::cout << "foo(1, 32): " << foo(1, 32) << std::endl; std::cout << "bar(1, 32): " << bar(1, 32) << std::endl; std::cout << "1 >> 32: " << (1 >> 32) << std::endl; //warning here std::cout << "(int)1 >> (int)32: " << ((int)1 >> (int)32) << std::endl; //warning here }
令人驚訝的是。 🎜>foo() 的行為函數
foo(1, 32): 1 // Should be 0 bar(1, 32): 0 1 >> 32: 0 (int)1 >> (int)32: 0</code>
在foo()函數中,移位操作是在沒有強制轉換的情況下執行的,導致CPU執行邏輯右移,在許多架構上,邏輯右移實現為>。結果為1。保證為0,因為b (32) 小於操作數(64) 中的位數。 >編譯器最佳化
在1 >> 的情況下32、(int)1>> (int)32,編譯器在編譯時最佳化這些常數表達式。的未定義行為,其中計數為負數或大於或等於操作數的長度。行為
右移的實現不同CPU 的操作可能有所不同。模式。這一點至關重要考慮潛在的未定義行為,特別是當移位計數超過操作數的長度時。 。
以上是為什麼 C 中的右移位運算子 (`>>`) 在移位 32 位元時會產生意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!