为什么这个比较会返回错误?

时间:2012-04-09 20:35:04

标签: c

在这个小程序中:

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

2 个答案:

答案 0 :(得分:8)

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

表达式:

a == (b + 1)

等同于:

0 == 256

这是假的。

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

答案 1 :(得分:2)

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