在这个小程序中:
#include <unistd.h>
#include <stdint.h>
#include <stdio.h>
int main() {
uint8_t a = 0;
uint8_t b = 255;
if (a == (b + 1)) {
printf("Equal\n");
} else {
printf("Not equal\n");
}
if (a == ((b + 1) & 0xFF)) {
printf("Equal\n");
} else {
printf("Not equal\n");
}
}
我明白了:
Not Equal
Equal
为什么比较不起作用,除非我强行拿最后8位?我猜我在这里遗漏了一些无符号算术的细微差别......
如果这有所不同,我正在使用gcc 4.4.5。
答案 0 :(得分:8)
由于整数提升,==
和+
运算符的两个操作数都会提升为int
。
表达式:
a == (b + 1)
等同于:
0 == 256
这是假的。
表达式:a == (uint8_t) (b + 1)
会给出您期望的结果(true)。另一种解决方案是在第二个& 0xFF
语句中使用if
,
答案 1 :(得分:2)
1
是一个整数,因此表达式将提升为int
。使用此类型,比较得到0 == 256
。在另一种情况下,你只用8位数字强制和,所以比较成立。