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

时间:2015-01-08 05:17:59

标签: c++ memory-management twos-complement

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

2 个答案:

答案 0 :(得分:0)

0xFFF可以 。在十六进制中,它只是位 - 剩下的就是你如何解释它。它还取决于我们所讨论的数据类型的宽度。

假设您没有使用12位数据类型,您显示的特定值总是 4095。

现在,如果我们建立整数的宽度,并选择不同的值,事情会变得更有趣。取一个16位值0xFFFF,例如:

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

答案 1 :(得分:0)

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

对于签名的C ++原语类型,标准并不关心。它是否存储为二进制补码由CPU架构决定,由于易于硬件实现,因此对于x86和大多数架构使用了两个补码。