这是我的代码:
byte b = (byte) 0xFF;
System.out.println(b);
我希望看到255
,但我看到-1
。发生了什么?编译器是使用有符号而不是无符号字节吗?
答案 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
类型