负数的除2和右移1位

令人费解的输出

且看如下代码,试问输出是什么。

1
2
3
4
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

1
2
3
4
5
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取整;位运算结果向下取整

坚持原创文章分享,您的支持将鼓励我继续创作!