public void int2byte(){
int x = 128;
byte y = (byte) x;
System.out.println(Integer.toHexString(y));
}
我得到的结果是ffffff80,为什么不是80? 当x = 127时我得到结果7f。
答案 0 :(得分:3)
字节在Java中签名。将128
投射到byte
时,它变成-128
。
int
128
:00000000 00000000 00000000 10000000
byte
-128
:10000000
然后,当您使用int
将其扩展回Integer.toHexString
时,由于它现在是负数,因此会进行符号扩展。这意味着会出现一堆1
位,解释十六进制输出中多余的f
个字符。
您可以使用Byte.toUnsignedInt
以无符号方式将其转换,以防止符号扩展。
通过无符号转换将参数转换为
int
。在对int
的无符号转换中,int
的高24位为零,而低阶8位等于byte
自变量的位。>
System.out.println(Integer.toHexString(Byte.toUnsignedInt(y)));
另一种方法是通过手动保留byte
的8位来对掩码扩展的位进行位屏蔽:
System.out.println(Integer.toHexString(y & 0xFF));
无论哪种方式,输出为:
80
答案 1 :(得分:2)
这是因为不能用带符号的字节表示正值128
范围是-128 to 127
因此您的int变为符号扩展,因此您得到的不是0x00000080,而是0xffffff80
编辑:正如其他人所解释的:
整数128与字节(-128)共享最后8位
区别在于Integer 128的前导零。
0x00000080 (0000 0000 0000 0000 0000 0000 1000 0000)
而字节-128只是
0x80 (1000 0000)
当您使用Integer.toHexString()
转换字节-128时,它采用前导1并对其进行符号扩展,这样您就可以得到
0xffffff80 (1111 1111 1111 1111 1111 1111 1000 0000)