您的位置:首页 > 其它

(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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: