int i = 12;
int j = i >> 32; // j == 12 (意外保持原值)
j = i >> 31; // j == 0
j = j >> 1; // j == 0
為何 >> 32 不歸零反而等於原值?
根據 C/C++ 標準(ISO/IEC 14882):
若右移位數 大於或等於 左操作數的位寬(如 32 位 int 移位 ≥ 32),或移位數為負數,行為為 未定義。
編譯器可自由選擇:截斷移位數、返回 0、返回原值、甚至崩潰。
sar 只取低 5 位(對 32 位),即 count & 0x1F。32 & 0x1F = 0,相當於 >> 0,故保持原值。SAR/SHR 指令僅使用計數器低 5/6 位,行為與 MSVC 一致。; i >> 32
mov eax, 12
sar eax, 32 ; 實際執行 sar eax, 0 -> eax 仍為 12
; i >> 31
mov eax, 12
sar eax, 31 ; 算術右移 31 位,符號位擴展,結果為 0
if (shift >= 32) return 0;(針對 32 位 int)。uint32_t)進行邏輯右移,避免算術右移符號擴展驚喜。-Wshift-count-overflow (GCC/Clang) 或 /W4 (MSVC)。i >> 32 之所以等於 12,純屬 MSVC/x86 實現細節(移位數取模 32)。標準不保證此行為,切勿在生產代碼中利用此特性。移位操作務必確保位數在 [0, 位寬-1] 區間內。