【问题标题】:Why byte b = (byte) 0xFF is equals to integer -1?为什么字节 b = (byte) 0xFF 等于整数-1?
【发布时间】:2010-12-13 06:33:09
【问题描述】:

为什么byte b = (byte) 0xFF 等于integer -1

例如:

int value = byte b = (byte) 0xFF;
System.out.println(value);

它将打印-1

【问题讨论】:

    标签: java bit twos-complement


    【解决方案1】:

    字节是用 Java 签名的。在二进制中,0x00 是 0,0x01 是 1,依此类推,但所有 1(即 0xFF)都是 -1,0xFE 是 -2,依此类推。请参阅Two's complement,这是使用的二进制编码机制。

    【讨论】:

    【解决方案2】:
    1. b 被提升为 int,以确定要调用的 system.out.println 的哪个重载。

    2. Java 中的所有字节均已签名。

    3. 有符号字节0xff 表示值-1。这是因为 Java 使用two's complement 来表示有符号值。有符号字节0xff代表-1,因为它的最高有效位是1(因此它代表一个负值),它的值是-128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1

    【讨论】:

      【解决方案3】:

      也许你的困惑来自于为什么(byte)0xFF 在某种程度上等于(int)0xFFFFFFFF。这里发生的是从较小到较大的有符号类型的提升导致较小的值被符号扩展,由此最高有效位被复制到提升值的所有新位。无符号类型不会进行符号扩展,它们得到零扩展,新位将始终为零。

      如果它可以帮助您吞下它,请这样想,任何大小的每个整数也都有一些“幻像”位,这些位太重要而无法表示。它们在那里,只是没有存储在变量中。当您将较小的值提升为较大的值时,负数的这些位非零,而正数的幻位全为零,这些幻位变为实位。

      【讨论】:

        【解决方案4】:

        如果您使用带符号的 int,则 0xFF = -1,因为 2-补码。

        这篇wiki文章解释得很好,见右表: http://en.wikipedia.org/wiki/Two%27s_complement

        【讨论】:

          【解决方案5】:

          因为 Java(和大多数语言)使用 two's-complement math 表示负整数值。在二进制补码中,0xFF (11111111) 表示(在有符号整数中)值 -1。

          【讨论】:

            【解决方案6】:

            减少模

            字节 = 256 0xff = 255

            255 / 256 -> 余数 255

            所以 255 - 256 = -1

            简单的逻辑 干杯

            【讨论】:

              【解决方案7】:

              不只是 Java 会进行 2 的补码运算。这就是我能想到的每个微处理器和 DSP 的数学运算方式。所以,它是每一种编程语言都代表它的方式。

              【讨论】:

              • 严格来说,某些语言(例如 C 和 C++)没有指定整数使用什么表示。它是特定于平台的。另一方面,Java 确实指定了 2 的补码表示。
              猜你喜欢
              • 2018-07-06
              • 2012-05-28
              • 1970-01-01
              • 2017-08-08
              • 2019-06-06
              • 2017-06-06
              • 2018-06-22
              • 1970-01-01
              • 2010-12-08
              相关资源
              最近更新 更多