首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言位移運算陷阱全解析:負數移位、補碼機制與面試真題詳解

     編輯:關於C語言

異常現象:負數移位位數

1 << -1  // 結果:-2147483648 (即 -2^31)

表面看是左移 -1 位(相當於右移 1 位),實際等價於 1 << 31。

規則(Java/JavaScript 32 位整型):m << -n ≡ m << (-n % 32 + 32)。C 語言編譯報錯,但 Java 結果相同。長整型 1L << -1 → -9223372036854775808(-2^63)。

1 >> -1 固定為 0。

補碼回顧:為何 1 << 31 是負數

  • 正數補碼 = 原碼
  • 負數補碼 = 符號位不變,數值位取反 +1
  • 1 補碼:000...001(32 位)
  • 左移 31 位 → 100...000 = -2147483648(最小 int)

(1 << 31) - 1 跨語言差異

  • Java:溢出變最大正數 2147483647
  • JavaScript:自動升 64 位浮點 → -2147483649

面試真題:-13 >> 2

步驟:

  1. -13 原碼:100...1101
  2. 補碼:符號位 1,數值位取反 0010 +1 → 0011 → 111...0011
  3. 算術右移 2 位(符號位擴展):111...1100
  4. 結果補碼 111...1100 → 原碼 100...0100 = -4

速記法:算術右移 1 位 = 除以 2 向下取整。-13/2 = -6.5 → -7,再 /2 = -3.5 → -4。

總結

  • 左移:移出高位,低位補 0
  • 右移:無符號→邏輯右移(高位補 0);有符號→多數機器算術右移(高位補符號位),C 標準未強制規定
  • 負數移位位數屬未定義/實現相關行為,實際開發中**嚴禁使用**
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved