为什么负数除二和右移一位的结果不一样?

原文地址:http://blog.csdn.net/tinyjian/article/details/50429660


问题描述:

为什么负数除二和右移一位的结果不一样?

这是在VS2013,C#中

这是在CB中

也有一些编译器,结果是一样的,但是为什么结果会是这样呢?

究其原因,还得看看汇编代码,在VS2013中提供了反汇编指令,结果如下


可以看到。

第一句:F = X / 2

[plain]  view plain  copy
  1. 00DF39F7  mov         eax,dword ptr [ebp-58h]   ;将X的值移到寄存器eax  
  2. 00DF39FA  mov         ecx,2                     ;将值2移到ecx  
  3. 00DF39FF  cdq                                   ;将eax高位扩展到edx  
  4. 00DF3A00  idiv        eax,ecx                   ;做除法运算  
  5. 00DF3A02  mov         dword ptr [ebp-50h],eax   ;移动到内存  

(关于idiv指令详见二进制除法)

第二句:G = X >> 1

仅仅是做一个右移运算,所以如果最低位是1的话,就会被抹去。

总结:

除法运算,结果都向0取整;位运算结果向下取整

所以对于正数来说位运算和除法结果是一样的,因为正数的向下取整也就是向0取整;而对于负数来说,向下取整要比向0取整小1.


猜你喜欢

转载自blog.csdn.net/michaelhan3/article/details/74518925