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