(int)(a - b)并不安全,其中a和b均为unsigned int
2016-02-22 16:36
190 查看
<pre name="code" class="cpp">return (int)(a - b);
其中a和b均为unsigned int。
这段代码是有隐患的。
如果要理解为什么有隐患,首先你要温习下计算机内如何表示负数和减法如何实现(有很多详尽的文章描述,这里仅以例子int为说明)
负数表示
第31位为负数表示位,0表示正数,1表示负数
减法实现
减一个数,就是加这个数的负数:A - B = A + (-B)
什么是补码?简而言之,正数的补码就是原码,负数的补码就是反码+1
1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码;
2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。
如:
原码 反码 补码
-127 -〉127 1000 0001 -〉 0111 1110 -〉 0111 1111
127 -〉-127 0111 1111 -〉 1000 0000 -〉 1000 0001
-128 -〉128 1000 0000 -〉 0111 1111 -〉 1000 0000
128 -〉-128 1000 0000 -〉 0111 1111 -〉 1000 0000
但是呢,这只是int下的原理,因为unsigned int是无符号的,所以其补码是所有位取反后加1
回到例题:
如a = 1, b =0x80000002,它的计算过程如下
00000001 00000001
- 80000002 = + 7FFFFFFE = 7FFFFFFF
即a - b > 0(a > b)
相关文章推荐
- JDK自带的日志Logging
- HDU 3037 Saving Beans(Lucas定理的直接应用)
- 《Java程序设计》第四章-认识对象
- python+mysql抓取百度新闻的标题存到数据库
- quagga线程机制概述
- corosync+pacemaker+drbd实现web服务高可用
- dataTables-使用详细说明整理
- PeekInputStream
- hive安装配置与hive的JDBC (hadoop-0.20.2 + hive-0.7.0)
- h5之选项卡
- JAVA NIO概述(一):I/O模型
- ANDROID_MARS学习笔记_S05_004_过滤杂质,得到真正的加速度
- collections.defaultdict类的使用
- Linux NAT转发设定
- Cairo教程
- 自定义Xcode代码片段
- 值得收藏的文章(杂七杂八)
- php-fpm upstream sent too big header while reading response header from upstream
- cdh 不在 sudoers 文件中。此事将被报告。
- Tabbar上拉隐藏下拉显示