博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【小知识】为什么负数除二和右移一位的结果不一样?
阅读量:7066 次
发布时间:2019-06-28

本文共 510 字,大约阅读时间需要 1 分钟。

问题描述:

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

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

转载于:https://www.cnblogs.com/tinyjian/p/6550701.html

你可能感兴趣的文章
iOS8 PUSH解决方法
查看>>
IPC通信:Posix消息队列
查看>>
Codeforces Round #279 (Div. 2) A. Team Olympiad 水题
查看>>
小米盒子 作为nas服务器
查看>>
WCF服务实现客户端Cookie共享,表单验证的解决方案
查看>>
Rule Or WorkFlow
查看>>
Unity自动构建
查看>>
Windows Phone 8.1上的开发人员请看
查看>>
BZOJ3118 : Orz the MST
查看>>
UVa 130 - Roman Roulette
查看>>
乌云首届安全峰会
查看>>
数据库操作(ADO)
查看>>
24点经典算法
查看>>
分享一个德州扑克的算法
查看>>
SQL Server2012 创建定时作业——图文并茂,教你轻松快速创建
查看>>
Response.Redirect 打开新窗体的两种方法
查看>>
lua 的 table 处理
查看>>
MyBatis中的#和$的区别
查看>>
DSO、CUBE区别(覆盖、合计)
查看>>
优麒麟(UbuntuKylin)不是国产Linux操作系统
查看>>