【问题标题】:How to convert int to hex in java?如何在java中将int转换为hex?
【发布时间】:2018-08-02 17:07:11
【问题描述】:
public void int2byte(){
    int x = 128;
    byte y = (byte) x;
    System.out.println(Integer.toHexString(y));
}

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

【问题讨论】:

标签: java byte


【解决方案1】:

字节是用 Java 签名的。当您将128 转换为byte 时,它变为-128

int128: 00000000 00000000 00000000 10000000

byte-128: 10000000

然后,当您使用Integer.toHexString 将其扩大回int 时,因为它现在是负数,所以它会进行符号扩展。这意味着出现了一堆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

【讨论】:

  • 或者通过使用移位运算符:将 8 位移到左外层,然后将它们无符号移回右外层 System.out.println(Integer.toHexString(y << 24 >>> 24)); // 80
【解决方案2】:

这是因为正值 128 不能用有符号字节表示

范围是-128 to 127

所以你的 int 变成了符号扩展,所以你得到的是 0xffffff80 而不是 0x00000080

编辑:正如其他人所解释的:

整数 128 与字节 (-128) 共享最后 8 位

不同之处在于整数 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)

【讨论】:

  • 正确,但不完整。您应该显示实际的byte 值是什么,即-128,并解释符号扩展出现的原因和位置。
猜你喜欢
  • 2015-12-09
  • 2016-03-23
  • 2018-07-22
  • 2014-04-17
  • 2016-09-21
  • 2019-06-04
  • 1970-01-01
  • 2016-10-22
  • 2012-08-01
相关资源
最近更新 更多