2012-04-09 55 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位數字即可強制使用,因此可以進行比較。