2012-04-09 78 views
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,如果这有所作为。

回答

8

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

表达:

a == (b + 1) 

然后等效于:

0 == 256 

这是错误的。

表达式:a == (uint8_t) (b + 1)会给你你期望的结果(true)。另一种解决方案是使用& 0xFF就像你的第二个if声明,

+0

啊哈,我以前从来没有听说过那样做。 – 2012-04-09 20:38:37

+5

重要的不是'=='的操作数,它是'+'的操作数。 – 2012-04-09 20:39:25

+0

我会不会猜到的!好想法。 – HWende 2012-04-09 20:40:32

2

1是一个整数,所以表达式提升为int。使用这种类型,比较得到0 == 256。在另一种情况下,您只需要8位数字即可强制使用,因此可以进行比较。

相关问题