当我在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
类型。
这是什么意思?我该怎么做才能解决它?
~(uint8_t)0
应该是(uint8_t)~0
。 ~
的操作数,与其他算术运算符一样,将扩展为int
(或者如果不是所有原始类型的值都可以在unsigned int
中表示为int
),并且所有位反转的int
0
都超出uint8_t
的范围,除非是实现支持负零...引用holy book, 6.5.3.3p4的上一版本:
~
运算符的结果是其(提升的)操作数的按位补码(也就是说,当且仅当转换的操作数中的相应位未设置时,结果中的每个位都会置位)。整数提升在操作数上执行,结果具有提升类型。如果提升类型是无符号类型,则表达式~E
等于该类型中可表示的最大值减去E
。
为了获得最大的兼容性,你应该使用0U
而不是0
来确保将值提升为unsigned int
而不是int
,但很可能你的计算机是2的补码 - 尤其是像uint8_t
这样的固定宽度类型 - 以及(uint8_t)~0
将等同于(uint8_t)~0U
(可能在1的补码或符号和数量上有所不同!)。