【问题标题】:Binary presentation of negative integer in JavaJava中负整数的二进制表示
【发布时间】:2014-10-11 14:36:06
【问题描述】:

请帮助我理解负整数的二进制表示。

例如,我们有 5 个。 5 的二进制表示是00000000.00000000.00000000.00000101

据我了解,-5 的二进制表示应该类似于10000000.00000000.00000000.00000101

但输出是11111111.11111111.11111111.11111011

我有两个问题:

1) 为什么这里有这么多1 位。

2) 我真的无法理解最后 3 位 011。它看起来像3。即使 +1 或 -1 也会是 100010

谢谢

【问题讨论】:

标签: java


【解决方案1】:

您对这些负数应该是什么样子的理解是有缺陷的。 Java 对负数使用二进制补码,基本规则是取正数,反转所有位,然后加一。这会让你消极。

因此,正如您所说,五个是:

0000...00000101

反转给你:

1111...11111010

然后加一个得到:

1111...11111011

you-5 显示的位模式是所谓的符号/幅度,您只需翻转最左边的位即可否定一个数字。这在 C 实现中作为 three possibilities(a) 之一是允许的,但 Java 仅使用二进制补码(用于负整数)。


(a) 但请记住,目前 C 和 C++ 都在努力移除其他两种编码类型,只允许二进制补码。

【讨论】:

    【解决方案2】:

    据我了解,-5 的二进制表示应该类似于10000000.00000000.00000000.00000101

    如果 Java 使用 Sign and Magnitude 表示整数,那将是正确的。但是,Java 使用Two's Complement 表示,因此其余位将根据该表示的规则进行更改。

    二进制补码表示背后的想法是,当您将这种表示中的一个数字添加到另一个值中时,删除最高有效端的额外位,结果就像您减去一个相同大小的正数一样。

    您可以用十进制数来说明这一点。在两位数表示中,值 99 的行为类似于 -1,98 的行为类似于 -2,97 的行为类似于 -3,依此类推。例如,如果您将23 + 99 = [1]22 中的最高位去掉,那么 99 的行为类似于 -1。 23 + 98 = [1]21,所以 98 的行为类似于 -2。

    这与二进制数的二进制补码表示方式相同,只是您将删除顶部的额外位。

    【讨论】:

      【解决方案3】:

      http://en.wikipedia.org/wiki/Two%27s_complement

      负数的存储方式是最高有效位(例如,对于 32 位数字表示 2^31 的位)被视为负数。因此,如果您存储所有 1,您将加起来

      (-2^31) + 2^30 + 2^29 + ... + 2^1 + 2^0
      

      这使得-1

      小负数将主要是这种表示下的负数。

      【讨论】:

        【解决方案4】:

        以下是 2 的恭维示例:

        如果你有 -30,并且想用 2 的补码表示它,你就取 30 的二进制表示:

        0000 0000 0000 0000 0000 0000 0001 1110

        反转数字。

        1111 1111 1111 1111 1111 1111 1110 0001

        然后加一个。

        1111 1111 1111 1111 1111 1111 1110 0010

        转换回十六进制,即 0xFFFFFFE2。事实上,假设你有这个代码:

        #include <stdio.h>
        
        int main() {
            int myInt;
            myInt = 0xFFFFFFE2;
            printf("%d\n",myInt);
        
            return 0;
        }
        

        这应该产生 -30 的输出。喜欢就试试吧。

        【讨论】:

          【解决方案5】:

          对于二进制补码,MSB 为 1 确实表示负数。但其余位不是其值的二进制表示。另一方面,如果 MSB 为 0,则剩余位表示二进制值。但那时不能说这个数字是正数。零既不是正数也不是负数。

          当我开始了解到数字的表示形式比 0..9 更多时,这张图帮助我理解了原理:

                     0
              -1    000    1
                 111   001  
          -2  110         010  2
                 101   011
              -3    100    3
                    -4
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-02-20
            • 2012-12-10
            • 1970-01-01
            • 2015-01-21
            • 2019-06-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多