如果我在C中有一个正常的32位int,那么这个数字在内存中是如何表示的?具体来说,标志是如何存储的?
起初我认为这将是符号和幅度,但后来我记得会有+和 - 0,所以我认为它可以存储在两个补码中,但是当使用两个补码时我最终获得了最大值4294967293,MSB设置为0(我通过总结从2 ^ 31到2 ^ 0的所有内容获得此值),我们都知道这是错误的。
答案 0 :(得分:2)
C标准并没有强制要求补充,但它是迄今为止最常见的选择(我认为即便如此也是轻描淡写)。你到达40亿的东西而不是正确的INT_MAX
的原因是一个错误的原因:你也添加了第32位。 2 31 是MSB的值(因为LSB的值为2 0 ),因此正确的值是2 0 +的和。 .. + 2 30 = 2 31 -1。
答案 1 :(得分:1)
即使这是实现定义,大多数机器使用两个补码。
问题是您的计算错误。总结2 ^ 0到2 ^ 31(顺便说一下是2 ^ 32 - 1)意味着你使用32位。这是不正确的:只有31位用于实际数字。 MSB具有特殊含义,它与符号有关(不是真正的“符号”)。所以,你需要总结从2 ^ 0到2 ^ 30(即2 ^ 31 - 1)。