JL2*_*210 0 c bit-manipulation bitwise-operators gcc-warning
当我在GCC中编译此代码段时:
uint8_t *reg = ..., newflags = ...;
...
if(*reg == (~(uint8_t)0))
{
newflags |= (1<<2);
newflags |= (1<<7);
}
Run Code Online (Sandbox Code Playgroud)
我收到此警告:
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。~像其他算术运算符一样,to 的操作数将被扩展为int(或,unsigned int如果不是原始类型的所有值都可以用表示int),并且int 0所有位都反转为的范围之外uint8_t,除非实现支持负零。 。引用圣经的先前版本6.5.3.3p4:
~运算符的结果是其(提升的)操作数的按位补码(也就是说,当且仅当未设置转换后的操作数中的相应位时,结果的每个位才被设置)。对操作数执行整数提升,并且结果具有提升的类型。如果提升的类型是无符号类型,则表达式~E等于该类型中可表示的最大值minusE。
为了获得最大的兼容性,您应该使用0U而不是,0以确保将值提升为,unsigned int而不是int,但是您的计算机极有可能是2的补码-特别是对于固定宽度类型,例如uint8_t-,其行为(uint8_t)~0等同于(uint8_t)~0U(可能与1的补码或符号和大小不同!)。