在内存地址中计算 2 补码中的符号位

Counting Sign Bit in 2's Complement in Memory Address

本文关键字:符号 补码 计算 内存 地址      更新时间:2023-10-16

例如,在 c++ 中,如果变量的内存地址显示为 0XFFF,我不确定它是 2047 还是 4095(包括"符号位")。 0xFFF二进制为 1111 1111 1111。我最近了解了"符号位",它只是指示数字是正数还是负数。我的另一个猜测是,转换为 2 的补码正数后,它将是 0000 0000 0001。所以我的问题是:0XFFF的内存地址是否表明它是 4095 还是 2047?或者,也许是 1?

0xFFF可以是其中之一。 在十六进制中,它只是位 - 其余的都取决于你如何解释它。它还取决于我们正在谈论的数据类型的宽度。

假设您没有使用 12 位数据类型,则您显示的特定值始终为 4095。

现在,如果我们确定整数的宽度,并选择不同的值,事情会变得更加有趣。 以 16 位值0xFFFF为例:

  • 解释为无符号整数(即 uint16_t ),它是 65535。
  • 作为有符号整数(即 int16_t ),它是 -1。

内存地址通常被视为无符号值,因此 two 的补码在这方面确实没有发挥作用。

对于有符号C++基元类型,标准不在乎。它是否存储为二进制补码取决于 CPU 架构,对于 x86 和大多数架构,由于硬件实现的便利性,使用 2 的补码。