窄转换到字节后的128 int变为-128

时间:2014-02-11 10:47:59

标签: java

我知道在java Byte中有8位内存,即从-128到127.我也知道缩小转换的概念。和int失去了一些精度。但有人可以帮助我理解以下内容

    public class PrimitiveTypes {
    public static void main(String[] args) {
        Byte byteVar= (byte) 128;

        System.out.println(byteVar);

    }
}


o/p is -128
请不要告诉我因为127的周期显示-128。 我需要在这里发生的二进制算术。 我能从网上找到的是java存储2的补码中的整数,用于存储负数。 所以从2的补充

  

128变为10000000

after flipping 11111111

并添加1位

10000000

问题是这10000000 变成-128?

ANS:

谢谢所有我得到的答案:

我需要将2的补码10000000转换为十进制,如

you first check if the number is negative or positive by looking at the sign bit. If it is positive, simply convert it to decimal. If it is negative, make it positive by inverting the bits and adding one. Then, convert the result to decimal. The negative of this number is the value of the original binary.

    Interpret 11011011 as a two's complement binary number, and give its decimal equivalent.
        First, note that the number is negative, since it starts with a 1.
        Change the sign to get the magnitude of the number.
            1   1   0   1   1   0   1   1
        ¬   0   0   1   0   0   1   0   0
        +                               1
            0   0   1   0   0   1   0   1
        Convert the magnitude to decimal: 001001012 = 25_16 = 2×16 + 5 = 37_10.
        Since the original number was negative, the final result is -37. 

所以在我的情况下  千万 变  01111111 加1将是  千万 这是128 因为第一位是1,所以原来的no是否定的 所以-128

1 个答案:

答案 0 :(得分:5)

在二进制文件中,int 128看起来像这样。

0000 0000 0000 0000 0000 0000 1000 0000

这是32位,4个字节。

当您将其强制转换为字节时,您将获得最后8位二进制数字。

1000 0000

这结果是字节-128的二进制表示。

结果确实是-128。

二进制中的所有字节值都是这样的:

1000 0000  -> - 128
1000 0001  -> - 127
1000 0010  -> - 126
...
1111 1110 -> -2
1111 1111 -> -1
0000 0000 -> 0
0000 0001 -> 1
0000 0010 -> 2
...
0111 1110 -> 126
0111 1111 -> 127

这应该让你清楚。

你的困惑可能是因为你在想 1000 0000作为无符号字节值。在Java中有 没有无符号字节。第1位确定符号 如果有无符号字节(如在其他一些语言中),则 这个二进制值确实是128而不是-128