在Jens Gustedt的《现代C》一书中,第59页,他解释了如何使用无符号整数来模拟有符号整数. 他的示例代码显示了如何实现将两个重新解释为有符号整数的无符号整数进行比较:
bool is_negative(unsigned a) {
unsigned const int_max = UINT_MAX /2;
return a > int_max;
}
bool is_signed_less(unsigned a, unsigned b) {
if (is_negative(b) && !is_negative(a)) return false;
else return a < b;
}
是我误解了什么,还是他错过了第二个特例,is_negative(a) = true
和is_negative(b) = false
?
例如,如果我们想要a = -1
和b = 1
,那么,使用2的补码,我们可以将它们表示为
unsigned int a = UINT_MAX;
unsigned int b = 1;
(例如,对于4位整数,我们将具有a=1111和b=0001).
现在我们有is_negative(a)
个返回true
,is_negative(b)
个返回false
.当调用is_signed_less(a, b)
时,我们以else
子句结束,而a < b
(现在解释为无符号整数)将返回FALSE.但是,-1<;1显然是真的,因此该函数返回错误的结果.
这是本书的代码中的一个错字,还是有什么我不明白的地方?