负数的除2和右移1位


令人费解的输出

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

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取整;位运算结果向下取整


文章作者: jerrycheese
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 jerrycheese !
  目录