Java 为什么int 1的最小值比正值离零远?

Java 为什么int 1的最小值比正值离零远?,java,c++,c,math,numbers,Java,C++,C,Math,Numbers,我想知道为什么int、double等的负值比正值多1个。简而言之:0必须适合某个地方,它位于正值中,这使得它们比负值少1个 示例:5个插槽用于负片,5个插槽用于正片,负片为-1到-5,正片为0到4 别忘了读@chrislink:) 正如@WhozCraig所指出的,这仅适用于使用有符号二进制数的二元补码表示的体系结构。对于C,不能保证您将在具有二元补码算术硬件(负一大于正)的机器上运行。实际上,可能是这样的。假设您有一个使用4位的整数数据类型。可以用它们表示16个可能的有符号整数。正整数值分

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

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

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

  • 别忘了读@chrislink:)

正如@WhozCraig所指出的,这仅适用于使用有符号二进制数的二元补码表示的体系结构。

对于C,不能保证您将在具有二元补码算术硬件(负一大于正)的机器上运行。实际上,可能是这样的。

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

0000b = 0
0001b = 1
0010b = 2
0011b = 3
0100b = 4
0101b = 5
0110b = 6
0111b = 7
对于下半年,有两种选择:

  • 将8个位置映射到整数
    -1
    -7
    和特殊值
    -0
    。这用于表示数字的补码和符号和大小
  • 将8个位置映射到整数
    -1
    -8
    。这是大多数程序员所熟悉的(也是您正在谈论的那个)

  • 负数映射如下:

    1000b = -8
    1001b = -7
    1010b = -6
    1011b = -5
    1100b = -4
    1101b = -3
    1110b = -2
    1111b = -1
    
    虽然这可能没有意义,但这种映射使执行算术运算变得很容易



    这不适用于浮动;它们的代表性不同。大多数浮点表示法在+0/-0两侧的范围相等。

    因为最简单、数学上最方便的有符号整数表示法就是这样工作的。
    double
    通常负值不会比正值多1。它通常具有与负值完全相同的正值数量。这取决于语言和实现。@stefan:对于Java,它不取决于实现。而对于C和C++,你能说出一个没有使用两个补码的实现吗?我会很惊讶,如果有一个存在,而不是有人在地下室做这件事作为一种爱好,不被生产中的任何人使用。(至少适用于int twos comps)。简单的短语“
    0
    必须适合某个地方。”是一个令人难忘的短语。@WhozCraig如果我懂英语,我也会这么说thing@DavidRF是的,我可能会在他的回答中澄清,这是关于使用两个补码格式存储签名的数字,这就是这个答案的全部内容,但这句话值得我投上一票。如果作者没有编辑它,我可能只是想澄清这一点。@Arnaud在编辑过程中抓住了我,但你总结了它。对我有好处。仍然喜欢这个短语。在积极的一面有
    0
    是好的,因为它允许积极的有符号和无符号有相同的表示。这是有效的保证。我不知道在过去30多年中设计的任何重要体系结构都没有使用二者的互补。当然,也有一些在过去30年中没有设计的非重要体系结构仍然有C编译器。看见