当我在GCC中编译此代码段时:
uint8_t *reg = ..., newflags = ...;
...
if(*reg == (~(uint8_t)0))
{
newflags |= (1<<2);
newflags |= (1<<7);
}
我收到此警告:
warning: comparison is always false due to limited range of data type [-Wtype-limits]
reg
和newflags
分别是uint8_t *
和uint8_t
类型。
这是什么意思?而我该如何解决?
答案 0 :(得分:5)
~(uint8_t)0
应该是(uint8_t)~0
。与其他算术运算符一样,~
的操作数将扩展为 int
(如果不是所有值,则扩展为 unsigned int
原始类型可以用int
表示,并且int
0
的所有位都在uint8_t
的范围之外,除非实现支持负零...引用holy book, 6.5.3.3p4的先前版本:
~
运算符的结果是其(提升的)操作数的按位补码(即,当且仅当未转换的操作数中的相应位未设置时,结果的每个位才被置位组)。对操作数执行整数提升,并且结果具有提升的类型。。如果提升的类型是无符号类型,则表达式~E
等于该类型可表示的最大值减去{{ 1}}。
为了获得最大的兼容性,您应该使用E
而不是0U
来确保将值提升为0
而不是unsigned int
,但是您的计算机很有可能是2的补码-尤其是对于诸如int
这样的固定宽度类型-uint8_t
的行为将等同于(uint8_t)~0
(在1的补码或符号大小上可能有所不同!)。