Java不能正确打印负二进制文件

时间:2015-10-25 03:18:07

标签: java

所以,我对java很新,我对字节系统有点困惑。所以我创建了这个程序,将整数转换为它们的基数两个值。

class Bits
{
    public static void main(String[] args)
    {
        byte a;
        a = 5;
        System.out.println(Integer.toBinaryString(a)); /* prints 101 */
        a = -1;
        System.out.println(Integer.toBinaryString(a)); /* prints
        11111111111111111111111111111111*/
    }
}

它正如预期的那样正数,但是当我输入负数时,它会变得奇怪。现在我知道两个人的恭维是什么,并没有说-111111111111111111111111111111111。应该是11111111,对吧?当我将a更改为int 255时,-1作为一个字节,当我将其切换为二进制时,我得到正常结果11111111。有人可以向我解释为什么会发生这种情况,或者我做错了什么。 (我使用的是java 8,我在Mac上)

1 个答案:

答案 0 :(得分:1)

Integer.toBinaryString接受int作为参数。因此a在传递给方法之前从byte转换为int。是的,32位整数的-1的两个补码是11111111111111111111111111111111

您应该尝试使用Integer.toBinaryString(a & 0xFF)。因此a被扩展为32位,但随后24通过屏蔽丢弃大多数相关位。 byte开始,所以保持位符号。所以结果是正确的。

您可以通过转换截断从a转换的int并将其解析为int并将其转换回byte来验证它:

int counter = 0;
for (byte a = -128; counter <= 256; ++a, ++counter)
{
   byte b = (byte)(Integer.valueOf(Integer.toBinaryString(a & 0xFF), 2) & 0xFF);
   System.out.println(a+" == "+b);
}