>>> 右移運算符完整語義
語法與類型
- 二元運算符:
operand >> shift_count
- 左操作數:整數類型 (有符號/無符號)
- 右操作數:非負整數,超寬度行為未定義
- 結果類型:與左操作數提升後類型相同
兩種右移模式
| 類型 | 名稱 | 高位填充 | 數學等價 |
| 無符號 | 邏輯右移 | 0 | ⌊x / 2^n⌋ |
| 有符號 | 算術右移 | 符號位複製 (實現定義) | 向負無窮取整除 2^n |
範例演示 (8位)
// 無符號
unsigned char u = 0x80; // 1000 0000 (128)
u >> 1 → 0100 0000 (64) = 128/2
u >> 2 → 0010 0000 (32) = 128/4
// 有符號 (補碼)
signed char s = -8; // 1111 1000
s >> 1 → 1111 1100 (-4) = -8/2
s >> 2 → 1111 1111 (-1) = -8/4 向負無窮取整
關鍵特性
- 優先級:低於算術運算符,高於關係/邏輯運算符
- 結合性:左結合
- 優化:編譯器常將
x / 2^n (x無符號或非負) 優化為 x >> n
- 未定義行為:移位數 ≥ 位寬、負數移位、有符號負數右移 (C標準為實現定義,但大多數編譯器算術右移)
實際應用場景
- 快速除以 2 的冪次 (配合無符號或非負有符號)
- 位域提取:
(value >> offset) & mask
- 網路字節序轉換:
(val >> 8) & 0xFF
- 圖形編程:顏色分量分離
- 壓縮/加密演算法:位流處理
配套運算符
<< 左移:低位補 0,等價乘 2^n (無溢出時)
& | ^ ~ 位與/或/異或/取反
- 複合賦值:
>>= <<= &= |= ^=
- 上一篇文章: C語言程序轉項目:從代碼到軟件產品的工程化流程
- 下一篇文章: C語言&取地址符詳解:scanf參數、指針初始化、地址傳遞
Copyright ©
程式碼之家 All Rights Reserved