<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)