原文地址:http://blog.csdn.net/tinyjian/article/details/50429660
问题描述:
为什么负数除二和右移一位的结果不一样?
这是在VS2013,C#中
这是在CB中
也有一些编译器,结果是一样的,但是为什么结果会是这样呢?
究其原因,还得看看汇编代码,在VS2013中提供了反汇编指令,结果如下
可以看到。
第一句:F = X / 2
(关于idiv指令详见二进制除法)
第二句:G = X >> 1
仅仅是做一个右移运算,所以如果最低位是1的话,就会被抹去。
总结:
除法运算,结果都向0取整;位运算结果向下取整
所以对于正数来说位运算和除法结果是一样的,因为正数的向下取整也就是向0取整;而对于负数来说,向下取整要比向0取整小1.