3

在这个小程序中:

#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。

4

2 回答 2

8

由于整数提升,==and+运算符的操作数都提升为int

表达方式:

a == (b + 1)

那么等价于:

0 == 256

这是错误的。

表达式:a == (uint8_t) (b + 1)会给你你期望的结果(真)。另一种解决方案是在您的第二个语句中使用& 0xFFlike ,if

于 2012-04-09T20:37:05.907 回答
2

1是一个整数,所以表达式被提升为int. 使用这种类型,比较得到0 == 256. 在另一种情况下,您仅使用 8 位数字强制and,因此比较成立。

于 2012-04-09T20:40:33.240 回答