问题描述:
为什么负数除二和右移一位的结果不一样?
这是在VS2013,C#中
这是在CB中
也有一些编译器,结果是一样的,但是为什么结果会是这样呢?
究其原因,还得看看汇编代码,在VS2013中提供了反汇编指令,结果如下
可以看到。
第一句:F = X / 2
00DF39F7 mov eax,dword ptr [ebp-58h] ;将X的值移到寄存器eax00DF39FA mov ecx,2 ;将值2移到ecx00DF39FF cdq ;将eax高位扩展到edx00DF3A00 idiv eax,ecx ;做除法运算00DF3A02 mov dword ptr [ebp-50h],eax ;移动到内存(关于idiv指令详见二进制除法)
第二句:G = X >> 1
仅仅是做一个右移运算,所以如果最低位是1的话,就会被抹去。
总结:
除法运算,结果都向0取整;位运算结果向下取整