在c ++中,如果变量的内存地址显示为0XFFF,我不确定它是2047还是4095(包括"符号位")。 0xFFF是二进制的1111 1111 1111。我最近了解了"符号位",它只是表明数字是正数还是负数。我的另一个猜测是,在转换成2的补码正数后,它将是0000 0000 0001。 所以我的问题是:0XFFF的内存地址是否表示它是4095或2047?或者,也许是1?
答案 0 :(得分:0)
0xFFF
可以 。在十六进制中,它只是位 - 剩下的就是你如何解释它。它还取决于我们所讨论的数据类型的宽度。
假设您没有使用12位数据类型,您显示的特定值总是 4095。
现在,如果我们建立整数的宽度,并选择不同的值,事情会变得更有趣。取一个16位值0xFFFF,例如:
uint16_t
),为65535。int16_t
),它为-1。答案 1 :(得分:0)
内存地址通常被视为无符号值,因此在这方面,两个补码确实没有发挥作用。
对于签名的C ++原语类型,标准并不关心。它是否存储为二进制补码由CPU架构决定,由于易于硬件实现,因此对于x86和大多数架构使用了两个补码。