如何在Java中将int转换为十六进制?

时间:2018-08-02 17:07:11

标签: java byte

public void int2byte(){
    int x = 128;
    byte y = (byte) x;
    System.out.println(Integer.toHexString(y));
}

我得到的结果是ffffff80,为什么不是80? 当x = 127时我得到结果7f。

2 个答案:

答案 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)