> 32 結果為 1,但是 1 (uint64_t) >> 32 結果為 0? " />
問題:
在C 程式中,右移運算子表現出奇怪的行為:
<code class="cpp">int foo(int a, int b) { return a >> b; } int main() { std::cout << "foo(1, 32): " << foo(1, 32) << std::endl; }
輸出為1,這是意外的,因為理論上結果應為0。
解釋:<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</code>
此行為源自於這樣一個事實:右移位運算子根據基礎資料型別的寬度而不同,對於32 位元整數(在本例中為int),右移是「邏輯」移位,這意味著無論b 的值如何,它都會用零填充空出的位,因此1 >> 32 的計算結果為1,因為移位超過位數沒有效果。 🎜>但是,對於64 位元整數(uint64_t),右移是「算術」移位,這表示它用與運算元相同的符號位填入空出的位,因為值1 有一個正符號位。 >>32的結果是0。量,允許編譯器在編譯期間將其折疊為0。 🎜>值得注意的是,此行為依賴於體系結構。等於32 的值可能會產生不可移植的結果。
以上是為什麼 1 >> 32 結果為 1,但 1 (uint64_t) >> 32 結果為 0?的詳細內容。更多資訊請關注PHP中文網其他相關文章!