数据类型范围有限

时间:2019-04-02 20:00:34

标签: c bit-manipulation bitwise-operators gcc-warning

当我在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]

regnewflags分别是uint8_t *uint8_t类型。

这是什么意思?而我该如何解决?

1 个答案:

答案 0 :(得分:5)

~(uint8_t)0应该是(uint8_t)~0。与其他算术运算符一样,~的操作数将扩展为 int (如果不是所有值,则扩展为 unsigned int 原始类型可以用int表示,并且int 0的所有位都在uint8_t的范围之外,除非实现支持负零...引用holy book, 6.5.3.3p4的先前版本:

  
      
  1. ~运算符的结果是其(提升的)操作数的按位补码(即,当且仅当未转换的操作数中的相应位未设置时,结果的每个位才被置位组)。对操作数执行整数提升,并且结果具有提升的类型。。如果提升的类型是无符号类型,则表达式~E等于该类型可表示的最大值减去{{ 1}}。
  2.   

为了获得最大的兼容性,您应该使用E而不是0U来确保将值提升为0而不是unsigned int,但是您的计算机很有可能是2的补码-尤其是对于诸如int这样的固定宽度类型-uint8_t的行为将等同于(uint8_t)~0(在1的补码或符号大小上可能有所不同!)。