首頁  >  文章  >  後端開發  >  為什麼 1 >> 32 結果為 1,但 1 (uint64_t) >> 32 結果為 0?

為什麼 1 >> 32 結果為 1,但 1 (uint64_t) >> 32 結果為 0?

Linda Hamilton
Linda Hamilton原創
2024-10-26 12:17:02986瀏覽

Why Does 1 >> 32 結果為 1,但 1 (uint64_t) >> 32 結果為 0? 
> 32 結果為 1,但是 1 (uint64_t) >> 32 結果為 0? " />

右移運算子的奇怪行為:1 >> 32

問題:

在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn