[英]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.