有限的数据类型

问题描述 投票:0回答:1

当我在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类型。

这是什么意思?我该怎么做才能解决它?

c bit-manipulation bitwise-operators gcc-warning
1个回答
5
投票

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

  1. ~运算符的结果是其(提升的)操作数的按位补码(也就是说,当且仅当转换的操作数中的相应位未设置时,结果中的每个位都会置位)。整数提升在操作数上执行,结果具有提升类型。如果提升类型是无符号类型,则表达式~E等于该类型中可表示的最大值减去E

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

© www.soinside.com 2019 - 2024. All rights reserved.