令人费解的输出
且看如下代码,试问输出是什么。
int F, G, X = -5;
F = X / 2;
G = X >> 1;
Console.WriteLine("F = {0}, G= {1}", F, G);
老师说过“乘2是二进制左移1位”,那除2理所当然应该是右移1位,所以两者结果是一样的。
然而,输出却是F = -2, G = -3
,在VS2013中,换成在codeblocks中,结果是一样的。
反汇编
在VS2013中对上述代码反汇编得到下图
第一句:F = X / 2
00DF39F7 mov eax,dword ptr [ebp-58h] ;将X的值移到寄存器eax
00DF39FA mov ecx,2 ;将值2移到ecx
00DF39FF cdq ;将eax高位扩展到edx
00DF3A00 idiv eax,ecx ;做除法运算
00DF3A02 mov dword ptr [ebp-50h],eax ;移动到内存
idiv指令是带符号的二进制除法
第二句:G = X >> 1
逻辑右移,最低位被舍弃
结论
除法运算,结果都向0取整;位运算结果向下取整