承接第一部分,本文詳細說明取補 ~與位移 << >>運算子的規則、有號/無號差異與程式碼驗證。
~對每個位元翻轉:0→1, 1→0。結果數值取決於運算元的靜態型別(有號 vs 無號)。
short a = 10; // 0000 1010
ushort b = 10;
int c = 10;
uint d = 10;
Console.WriteLine(~10); // -11 (int 常數)
Console.WriteLine($"short: {~a}"); // -11 (short 升級為 int 運算)
Console.WriteLine($"ushort: {~b}"); // -11 (ushort 升級為 int 運算)
Console.WriteLine($"int: {~c}"); // -11
Console.WriteLine($"uint: {~d}"); // 4294967285 (uint 保持無號)
關鍵:short/ushort 進行位元運算時會整數提升為 int,故 ~a、~b 型別為 int,結果為有號 -11。僅 uint 保持無號運算。
<<10 << 1 = 20、10 << 2 = 40。>>:算術 vs 邏輯位移| 運算元型別 | 行為 |
|---|---|
int、long(有號) | 算術位移:符號位複製(負數補 1,正數補 0) |
uint、ulong(無號) | 邏輯位移:高位補 0 |
int x = 16; // 0001 0000
x >>= 2; // 4 (0000 0100)
x >>= 2; // 1 (0000 0001)
x >>= 2; // 0
int y = -16; // 1111...0000 (補數)
y >>= 2; // -4 (1111...1100)
y >>= 2; // -1 (1111...1111)
y >>= 2; // -1 (符號位延伸)