在测试此代码时
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&#39;这是预期的行为,但在32,我得到了数字256。
我期待32上的0,但正如你所看到的,我得到的是256。当有人看到左移32时,有人可以给我一些关于dot NET运行时正在做什么的见解。
答案 0 :(得分:5)
实际上是在C#语言规范中:
对于预定义的运算符,要移位的位数计算如下:
•当x的类型为int或uint时,移位计数由计数的低5位给出。其他 换句话说,移位计数是从count&amp;为0x1F。
它也在MSDN上:
如果第一个操作数是int或uint(32位数),则移位计数由第二个操作数的低位5位给出。也就是说,实际的移位计数是0到31位。
因此将int
移动32与将其移动零完全相同。