转换0xFF给我-1 - >签名与未签名?

时间:2014-03-17 11:00:47

标签: java integer hex unsigned signed

这是我的代码:

byte b = (byte) 0xFF;
System.out.println(b);

我希望看到255,但我看到-1。发生了什么?编译器是使用有符号而不是无符号字节吗?

2 个答案:

答案 0 :(得分:4)

也许您对存储和表示之间的区别感到困惑。

正如其他人告诉你的那样,Java只使用有符号整数类型。由于字节只有8位,这意味着您的范围是-128到127.但请记住:这只是一个十进制表示,不会告诉您二进制存储!

更好地提醒Java的字节类型范围将是以下(十进制)表示:

0 1 ... 126 127 -128 -127 ... -2 -1

这直接对应于以下二进制表示:

00000000 00000001 ... 11111110 11111111

带符号的十进制表示称为two's complement。如您所见,二进制值11111111(正好是0xFF)对应于(带符号)十进制值-1。

如果您现在通过流发送此值,您将获得完整的0xFF值,无论您在Java程序的控制台输出中看到什么。

答案 1 :(得分:1)

在Java类型中byte已签名,无法使用"无符号字节"在java中。解决方法是使用short类型

相关问题