所以,我对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*/
}
}
它正如预期的那样正数,但是当我输入负数时,它会变得奇怪。现在我知道两个人的恭维是什么,并没有说-1
是11111111111111111111111111111111
。应该是11111111,对吧?当我将a
更改为int 255
时,-1
作为一个字节,当我将其切换为二进制时,我得到正常结果11111111
。有人可以向我解释为什么会发生这种情况,或者我做错了什么。 (我使用的是java 8,我在Mac上)
答案 0 :(得分:1)
Integer.toBinaryString
接受int
作为参数。因此a
在传递给方法之前从byte
转换为int
。是的,32位整数的-1的两个补码是11111111111111111111111111111111
。
您应该尝试使用Integer.toBinaryString(a & 0xFF)
。因此a
被扩展为32
位,但随后24
通过屏蔽丢弃大多数相关位。 1}}因为你从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);
}