为什么这种比较总是如此?

时间:2010-10-01 03:07:32

标签: c++ warnings unsigned-char

我的文件中包含以下代码:

unsigned char * pData = new unsigned char...

...

if(pData[0] >= 160 && pData[0] <= 255)

当我编译它时,我收到编译器的警告(gcc):

  

警告:由于数据类型的范围有限,比较始终为真

这怎么可能?不是unsigned char 0-255的范围?我很困惑。

5 个答案:

答案 0 :(得分:11)

如果unsigned char的范围是0255pData[0]的范围是char那么pData[0] <= 255将始终是true }}

答案 1 :(得分:5)

表达式pData[0] <= 255始终为真,因为unsigned char的范围是0..255(在您的特定实现中)。

由于pData[0] >= 160可以是真实的 false,所以只抱怨表达式。

请注意,所有实施的unsigned char范围不必为0..255(ISO C标准不强制要求)。

答案 2 :(得分:3)

比较的第二部分是多余的。它总是小于或等于255。

答案 3 :(得分:0)

您应该始终使用表达式来表达,以避免歧义,例如:

if ((pData[0] >= 160) && (pData[0] <= 255))

这是否解决了这个问题?

第二次比较是多余的,所以请使用:

if (pData[0] >= 160)

答案 4 :(得分:0)

  

不是unsigned char的范围   0-255?

unsigned char的范围是实现定义的(与其他一些帖子相反)。这是因为用于表示char的位数总是不是8。只是char在您的特定实现上占用1 8位,因此255是上限。

因此,如果有一些其他含义附加到255(除了'numeric_limits<char>::max()'),我认为您仍应继续使用检查,否则检查是多余的。