【问题标题】:Why does 0xff equal to negative 0 in C++为什么 0xff 在 C++ 中等于负 0
【发布时间】:2017-06-06 02:34:09
【问题描述】:

我看到一些代码是这样的:

Object *area = new Object[n];
memset(area, 0xff, sizeof(Object) * count);

所以这会用位 1 填充对象数组的每个字段。然后有多个地方通过检查 ~0(负零)来检查对象的字段是否尚未填充:

const unsigned int NULL_INDEX = ~0;
...
if(object.field == NULL_INDEX) {...}

该 Object 类的字段是 unsigned int 类型。我很困惑为什么 0xff 在无符号整数上可以被评估为等于〜0?我看到另一个 post 在 2 的补码系统上谈论 0xff 等于 -1,并发现另一个 post 我认为这意味着 C++ 程序将 0xff 解释为 -1 还是 ~0 取决于系统?

C++ 中填充 0xff 时检查整数的可移植方式到底是什么?是否应该根据 unsigned int 或 signed int 检查?我很困惑...

【问题讨论】:

  • ~0 不是负 0。
  • ~ 反转每一位。
  • 在最常见的表示形式(2 的补码)中,整数没有负 0。
  • 你应该避免在 C++ 中使用memset。例如,如果 Object 持有指针,则使用 0xFF 可能会出现问题。 Object 构造函数应该负责自己的初始化。对象应始终在创建时进行初始化,因此检查它们是否已初始化毫无意义。如果无法完成初始化,则应抛出异常。我建议您阅读 Sutter 的 Exceptional C++ 等书籍。
  • @Phil1970 我知道,但我只是想了解现有代码的作用。

标签: c++ bit twos-complement ones-complement


【解决方案1】:
~0

只需将所有位设置为 1。 例如,如果你有 32bit int 并且你使用

int all_the_ones = ~0;

那么你会在包含all_the_ones值的内存部分得到11111111111111111111111111111111

0xff 将 8 位设置为 1,因此对于 32 位 int,它将是 00000000000000000000000011111111

无论如何,要使 int 上的 0xff 等于 ~0,所讨论的 int 需要是 8bit/1byte,也就是 char

unsigned char a = ~0;
signed char b = ~0;

a 等于 255,b 等于 -1

在记忆中他们都是11111111

我不明白您为什么想知道 0xff 是否存储在 int 中,但与上面的 ab 进行比较应该可以。

【讨论】:

  • 很高兴能帮上忙^^
猜你喜欢
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 2022-01-25
  • 2011-02-01
  • 2016-05-03
  • 2012-11-11
相关资源
最近更新 更多