【问题标题】: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]

regnewflags 分别是 uint8_t *uint8_t 类型。

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

【问题讨论】:

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


    【解决方案1】:

    ~(uint8_t)0 应该是 (uint8_t)~0~ 的操作数,与其他算术运算符一样,将扩展为 int(如果不是所有原始类型的值都可以表示为 unsigned intint) 和 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 的补码或符号和大小上有所不同!)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-25
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多