我的文件中有以下代码:
unsigned char * pData = new unsigned char...
...
if(pData[0] >= 160 && pData[0] <= 255)
当我编译它时,我从编译器(gcc)收到警告:
警告:由于数据类型的范围有限,比较总是正确的
怎么会这样?范围不是unsigned char
0-255吗?我很困惑。
我的文件中有以下代码:
unsigned char * pData = new unsigned char...
...
if(pData[0] >= 160 && pData[0] <= 255)
当我编译它时,我从编译器(gcc)收到警告:
警告:由于数据类型的范围有限,比较总是正确的
怎么会这样?范围不是unsigned char
0-255吗?我很困惑。
如果 of 的范围unsigned char
是 from 0
to255
并且pData[0]
是 achar
那么pData[0] <= 255
将永远是true
。
该表达式pData[0] <= 255
始终为真,因为范围unsigned char
为 0..255(在您的特定实现中)。
它只是抱怨那一点表达,因为pData[0] >= 160
它可能是真或假。
请记住,对于所有unsigned char
实现,a 的范围不必是 0..255 (ISO C 标准不强制要求这样做)。
比较的第二部分是多余的。它始终小于或等于 255。
您应该始终为您的表达加上括号以避免歧义,例如:
if ((pData[0] >= 160) && (pData[0] <= 255))
这能解决问题吗?
第二个比较是多余的,所以使用:
if (pData[0] >= 160)
无符号字符的范围不是 0-255 吗?
unsigned char 的范围是实现定义的(与其他一些帖子相反)。这是因为用于表示 char 的位数并不总是 8。只是一个 char 在您的特定实现中占用 1 个 8 位位置,因此 255 是上限。
因此,如果 255 附加了其他含义(除了'numeric_limits<char>::max()
'),我认为您仍然应该继续使用检查,否则检查是多余的。