【问题标题】:How does 11111111111111111111111111111110 evaluate to -2? [duplicate]11111111111111111111111111111110 如何评估为-2? [复制]
【发布时间】:2019-05-08 08:29:08
【问题描述】:

我正在测试 Java 中的按位非运算符。我以二进制打印了 ~1 的结果,它返回了“11111111111111111111111111111110”,显然计算结果为-2。

我知道你必须加 1 才能得到 -1,最左边的位只是显示数字是正数还是负数,但我不明白为什么二进制数这么大和这么多1s 的计算结果为 -2。

【问题讨论】:

标签: java binary bit-manipulation


【解决方案1】:

11111111111111111111111111111110 是原始位表示。 Java 使用two's complement 表示有符号值,其中第一位(如果设置)表示负数。

Conversion from Two's Complement很好地解释了这一点:

以数字 0xFFFFFFFF 为例。在二进制中,即:

1111 1111 1111 1111 1111 1111 1111 1111

对于这个数字我们能说些什么?它的第一个(最左边)位是 1,这意味着这表示一个负数。这就是二进制补码的方式:前导 1 表示数字为负数,前导 0 表示数字为 0 或正数。

要查看这个数字的负数,我们反转这个数字的符号。但是怎么做呢?课堂笔记说(在 3.17 上)要反转符号,您只需反转位(0 变为 1,1 变为 0)并将结果数加一。

这个二进制数的倒数显然是:

0000 0000 0000 0000 0000 0000 0000 0000

然后我们加一个。

0000 0000 0000 0000 0000 0000 0000 0001

所以0xFFFFFFFF的负数是0x00000001,更常见的是1。所以0xFFFFFFFF-1

上面说明了为什么0xFFFFFFFF 的二进制补码(如反向位和加一)中的负数是1,这意味着0xFFFFFFFF 本身意味着-1。同样,0xFFFFFFFE 的值有一个负数 2,所以 0xFFFFFFFE 本身就意味着 -2 在二进制补码中。

【讨论】:

    【解决方案2】:

    另一种思考方式是,在 32 位有符号整数中,最左边的数字代表两个数字之一:

    0000000000000000000000000000000 represents 0
    1000000000000000000000000000000 represents -2147483648
    

    根据定义。其他所有内容都是对此的补充(添加),因此:

    BINARY REPRESENTATION                      INT REPRESENTATION
    1000000000000000000000000000000 plus       -2147483648 plus
    0111111111111111111111111111110 equals      2147483646 equals
    1111111111111111111111111111110                     -2
    

    将最左边(前导)位视为定义您从哪里开始计数会有所帮助:

    • 如果最左边位为0,则从0开始计数
    • 如果最左边位为 1,则从 -2147483648 开始计数

    它右侧的剩余 31 位通过组成一个添加到起点的数字(111 1111 1111 1111 1111 1111 1111 最多 2147483647)来定义整数值本身。


    然后,有符号整数有效地环绕。他们数到最大值约为 20 亿,然后立即翻转到 -20 亿并再次计数到 0:

    0111111111111111111111111111111 是 2147483647。如果你添加一个,你会得到: 1000000000000000000000000000000 要么是 2147483648 作为无符号整数,要么是 -2147483648,根据定义就是这种方式。当您继续添加到任何整数时,它会接近: 1111111111111111111111111111111 是 -1 作为有符号整数,或 4294967295 作为无符号整数

    最终,您应该欣赏并理解,如果您不断添加有符号整数,它们会环绕,但它们会立即从最大正值跳到中间的最小负值:

    0, 1, ... 2147483646, 2147483647, -2147483648, -2147483647, ... -2, -1
    

    这就是为什么您的 '1111111111111111111111111111110' 为 -2 的原因,因为它比最大二进制表示(在有符号整数空间中表示 -1)小一

    【讨论】:

      【解决方案3】:

      这是补码。如果要将数字转换为 TC(以 2 为例):

      1. 把它写成二进制(假设它只有 8 位来表示更短的表示)

        00000010
        
      2. 否定所有位

        11111101
        
      3. 加1

        11111110
        

      这就是为什么 2 看起来像这样的原因。

      【讨论】:

        猜你喜欢
        • 2020-12-11
        • 1970-01-01
        • 2018-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-21
        • 2017-04-28
        • 1970-01-01
        相关资源
        最近更新 更多