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

gct*_*gct 3 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");
    }       
}
Run Code Online (Sandbox Code Playgroud)

我明白了:

Not Equal
Equal
Run Code Online (Sandbox Code Playgroud)

除非我强行拿最后8位,为什么比较不起作用?我猜我在这里遗漏了一些无符号算术的细微差别......

如果这有所不同,我正在使用gcc 4.4.5.

oua*_*uah 8

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

表达方式:

a == (b + 1)
Run Code Online (Sandbox Code Playgroud)

等于:

0 == 256
Run Code Online (Sandbox Code Playgroud)

这是假的.

表达式:a == (uint8_t) (b + 1)将为您提供您期望的结果(true).另一个解决方案是& 0xFF在你的第二个if声明中使用,

  • 重要的不是`==`的操作数,而是`+`的操作数. (5认同)