9

我的文件中有以下代码:

unsigned char * pData = new unsigned char...

...

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

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

警告:由于数据类型的范围有限,比较总是正确的

怎么会这样?范围不是unsigned char0-255吗?我很困惑。

4

5 回答 5

11

如果 of 的范围unsigned char是 from 0to255并且pData[0]是 achar那么pData[0] <= 255将永远是true

于 2010-10-01T03:08:33.393 回答
5

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

它只是抱怨那一点表达,因为pData[0] >= 160它可能是真假。

请记住,对于所有unsigned char实现,a 的范围不必是 0..255 (ISO C 标准不强制要求这样做)。

于 2010-10-01T03:08:33.970 回答
3

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

于 2010-10-01T03:08:39.760 回答
0

您应该始终为您的表达加上括号以避免歧义,例如:

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

这能解决问题吗?

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

if (pData[0] >= 160)
于 2010-10-01T03:09:29.320 回答
0

无符号字符的范围不是 0-255 吗?

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

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

于 2010-10-01T03:23:22.417 回答