2015-11-07 39 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完全相同。