7

我想知道为什么 int、double 等负值比正值多 1 个。

4

3 回答 3

18

简而言之:0 必须适合某个地方,它在正数中,这使得它们比负数少 1。

示例:5 个槽用于负片,5 个槽用于正片,负片得到 -1 到 -5,正片得到 0 到 4

  • 不要忘记阅读@chris 链接 :)

正如@WhozCraig 指出的那样,这仅对使用二进制补码表示的有符号二进制数的体系结构有效。

于 2013-01-12T07:25:47.583 回答
3

假设您有一个使用 4 位的整数数据类型。您可以用它们表示 16 个可能的有符号整数。正整数值分配给范围的前半部分:

0000b = 0
0001b = 1
0010b = 2
0011b = 3
0100b = 4
0101b = 5
0110b = 6
0111b = 7

下半场,有两种选择:

  1. 将 8 个位置映射到整数-1-7特殊值-0。这由数字的补码符号和大小表示使用。
  2. 将 8 个位置映射到整数-1-8. 大多数程序员都熟悉(以及您正在谈论的那个)的二进制补码表示使用它。

负数映射如下:

1000b = -8
1001b = -7
1010b = -6
1011b = -5
1100b = -4
1101b = -3
1110b = -2
1111b = -1

虽然这可能没有意义,但这种映射使执行算术运算变得容易。


这不适用于花车;它们的表示方式不同。大多数浮点表示在 +0/-0 的任一侧具有相等的范围。

于 2013-01-12T22:54:03.493 回答
0

对于 C 语言,不能保证您将在具有二进制补码算术硬件的机器上运行(负数比正数多)。实际上,它可能会是这样。

于 2013-01-12T07:33:43.847 回答