簡體   English   中英

C中邏輯或的按位移位

[英]bitwise shift with logical OR in C

我原來的代碼將x轉換為最大的負整數是

*x = 1 <<31 | ~ 1<<31;

哪個有效,但是當我嘗試僅使用

*x = 1 <<31;

它返回了相同的答案,有人可以解釋為什么會這樣嗎?

如果int在體系結構的32位上,則最大的負int值顯然是0x80000000。
讓我們看一下代碼並添加括號以顯示運算符的優先級(這是此處的關鍵):

*x = 1 <<31 | ~ 1<<31 = (1 << 31) | ((~1) << 31)

表達式((~1) << 31)的計算結果為0x00000000。
所以最終結果是1 << 31 = 0x80000000

好吧,如果您知道二進制補碼,那么您知道對於32位整數,0x80000000必須是最大的負值,因為如果翻轉這些位並從0x80000000加一個,則得到0x7fffffff。 加一,您將得到0x80000000,這是32位可能的最大負數。 它的最高有效位(MSB)為1,鑒於初始數字需要為符號節省一點,因此沒有辦法使該數值更大。 您的原始代碼只是將int填充為1,然后移至31,最終結果與* x = 1 << 31;相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM