首頁 > 後端開發 > C++ > 為什麼 C 中的右移位運算子 (`>>`) 在移位 32 位元時會產生意外結果?

為什麼 C 中的右移位運算子 (`>>`) 在移位 32 位元時會產生意外結果?

DDD
發布: 2024-10-25 10:17:02
原創
476 人瀏覽過

C 中的

Why does the right shift operator (`>>`) 在移位 32 位元時會產生意外結果?
C 中的 >`) 在移位 32 位元時會產生意外結果? " />

右移運算子的意外行為(1 >> 32)

在程式設計領域,右移運算子(>> 32) ) 通常用於執行位元運算,特別是用整數除以2 的冪,但是,當移位較大的值時,可能會出現奇怪的行為,如以下C 程式碼所示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<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() 的行為函數

1

2

3

4

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板