【问题标题】:limited range of data types数据类型范围有限
【发布时间】:2019-04-02 20:00:33
【问题描述】:
当我在 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 类型。
这是什么意思?我该怎么做才能解决它?
【问题讨论】:
标签:
c
bit-manipulation
bitwise-operators
gcc-warning
【解决方案1】:
~(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 的补码或符号和大小上有所不同!)。