【问题标题】:Why both (byte) 400000 and (byte) -400000 result -128为什么 (byte) 400000 和 (byte) -400000 结果都是 -128
【发布时间】:2014-10-23 04:06:26
【问题描述】:

在 Java 中,为什么 (byte) 400000 和 (byte) -400000 的结果都是 -128?

其实我是按照https://stackoverflow.com/a/9085666/1037217的计算方法来的

案例:400000 二进制:1100001101010000000 修剪到 8 位数字:10000000 由于最左边的数字是1,所以从它的-1:01111111 然后反转它:10000000 结果:-128

对于案例:-400000 二进制:-1100001101010000000 修剪到 8 位数字:10000000 由于最左边的数字是1,所以从它的-1:01111111 然后反转它:10000000 结果:128

同样的方法适用于 (短)40000 = -25536 (短)-40000 = 25536

【问题讨论】:

  • 溢出了。您不能将这些数字中的任何一个存储在字节变量中。
  • 假设你给他们一个不同的值。现在取一些其他的数字,并做同样的事情,依此类推。显然,您最终需要超过 256 个不同的字节,这在定义上是不可能的。

标签: java casting byte twos-complement


【解决方案1】:

int 转换为 byte 将保留 int 数的最后 8 位(最后一个字节)。

 400000 = 0x61a80
-400000 = 0xfff9e580

两个数字的最后 8 位相同:0x80,即 2 的补码中的 -1

例如:

System.out.println((byte)0x23403); // Prints 3 (the last 8 bits: 0x03 = 3)
System.out.println((byte)0x23483); // Prints -125 (last 8 bits: 0x83 = -125)
// (in 2's complement: 0x83 = -(128-3) = -125)

【讨论】:

  • 对不起,我添加了一些例子,你能解释一下吗?
  • @Felix 只取最后 8 位。简单的。如果您想了解这些位会给您带来什么数字,您需要阅读并了解2's complement
【解决方案2】:

因为byte 的范围为 -128 到 127。您的两个值都溢出,然后进行缩小转换。引用 JLS Example 5.1.3-2. Narrowing Primitive Conversions that lose information,

// An int value too big for byte changes sign and magnitude:

【讨论】:

    【解决方案3】:

    如你所说:

    对于案例:400000 二进制:1100001101010000000 修剪到 8 位:10000000 因为最左边的数字是 1,所以从它得到 -1:01111111 然后反转它:10000000 结果:-128

    对于案例:-400000 二进制:-1100001101010000000 修剪到 8 位:10000000 因为最左边的数字是 1,所以从它的 -1:01111111 然后反转它:10000000 结果:128

    在这两种情况下,您得到的位模式都是10000000。这相当于-128 两次。一个byte不能代表值128;超出范围。

    但是,您的程序并不完全正确。你不能只放一个负号,然后“修剪到 8 位数字”。负号暂时不是有效状态。你或许应该研究一下2s complement representation of integers

    【讨论】:

    猜你喜欢
    • 2010-10-30
    • 2011-06-25
    • 2016-05-27
    • 2019-02-03
    • 1970-01-01
    • 2015-07-25
    • 2020-01-04
    • 1970-01-01
    相关资源
    最近更新 更多