我的文件中包含以下代码:
unsigned char * pData = new unsigned char...
...
if(pData[0] >= 160 && pData[0] <= 255)
当我编译它时,我收到编译器的警告(gcc):
警告:由于数据类型的范围有限,比较始终为真
这怎么可能?不是unsigned char
0-255的范围?我很困惑。
答案 0 :(得分:11)
如果unsigned char
的范围是0
到255
而pData[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()
'),我认为您仍应继续使用检查,否则检查是多余的。