2015-11-07 72 views
1

雖然測試出這個代碼在C#中左按位移位怪異的行爲

for (int i = 0; i <= 32; i++) 
{ 
    Console.WriteLine(i + " - " + ((byte.MaxValue + 1) << i)); 
} 

我得到這些輸出

0 - 256 
1 - 512 
2 - 1024 
3 - 2048 
4 - 4096 
5 - 8192 
6 - 16384 
7 - 32768 
8 - 65536 
9 - 131072 
10 - 262144 
11 - 524288 
12 - 1048576 
13 - 2097152 
14 - 4194304 
15 - 8388608 
16 - 16777216 
17 - 33554432 
18 - 67108864 
19 - 134217728 
20 - 268435456 
21 - 536870912 
22 - 1073741824 
23 - -2147483648 
24 - 0 
25 - 0 
26 - 0 
27 - 0 
28 - 0 
29 - 0 
30 - 0 
31 - 0 
32 - 256 

注意,從21到31,它給出的0這是預期的行爲,但在32,我回來了數字256.

我期待在32上0,但正如你可以看到我得到了256。有人可以給我什麼點NET運行時做一些見解時,看到一個左移32

+1

這不是很棒嗎?向左移32與32向左移1並不相同!雖然很奇怪,但對於C和C++中的相同運算符來說,這是一個小改進,它沒有爲左移過多而定義特定的行爲。至少定義了C#行爲,雖然有點奇怪。 –

回答

5

它實際上是在C#語言規範:

對於預定義的運營商,比特數按如下計算:

•當x的類型爲int或uint時,移位計數由count的低位5位給出。在其他 單詞中,移位計數從計數& 0x1F計算。

它也是上MSDN

如果第一操作數是一個整數或uint(32位量),移位計數由低階給出的第二操作數的5個比特。也就是說,實際的移位計數是0到31位。

因此,將int移位32與將其移位0完全相同。