Java 将0xFF转换为-1->;签名还是未签名?

Java 将0xFF转换为-1->;签名还是未签名?,java,integer,hex,unsigned,signed,Java,Integer,Hex,Unsigned,Signed,这是我的密码: byte b = (byte) 0xFF; System.out.println(b); 我希望看到255,但我看到的是-1。发生了什么事?编译器是否使用有符号字节而不是无符号字节?在Java类型中字节是有符号的,在Java中不可能使用“无符号字节”。一种解决方法是使用short类型可能您对存储和表示之间的区别感到困惑 正如其他人告诉您的,Java只使用有符号整数类型。由于一个字节只有8位,这意味着您有一个从-128到127的范围。但请记住:这只是一个十进制表示,并没有告诉您有

这是我的密码:

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

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

在Java类型中
字节
是有符号的,在Java中不可能使用“无符号字节”。一种解决方法是使用
short
类型

可能您对存储和表示之间的区别感到困惑

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

对于Java字节类型的范围,最好使用以下(十进制)表示法:

0 1 ... 126 127 -128 -127 ... -2 -1
00000000 00000001 ... 11111110 11111111
这直接对应于以下二进制表示:

0 1 ... 126 127 -128 -127 ... -2 -1
00000000 00000001 ... 11111110 11111111
带符号的十进制表示形式称为。如您所见,二进制值11111111(正好是0xFF)对应于(有符号的)十进制值-1


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

每次您在Java中操作字节变量时,
(byte)0xFF
将隐式转换为
(int)0xFFFF
(即
-1
)。您可以执行
0xFFFFFF&0xFF
,然后您将获得所需的
(int)255
(您将永远无法获得
(byte)255
,只有
(int)255


如果您只需要存储字节,那么无论屏幕上如何打印0xFF,内部仍然是(字节)0xFF。如果您需要对它们进行操作(与int、加法、减法、转换为字符串、在屏幕上打印,以及基本上其他任何操作相比),那么您需要知道它们将被转换为int 0xFFFFFF,这将被解释为-1。

Java始终是有符号的。Java中没有无符号类型看到我对Ok的回答很高兴知道这一点,但是我怎么能在cmd[0]变量中发送“255”呢?你不能。现在你说你是以“命令”的形式“发送”这个数组,你可以在接收部分“转换”有符号到无符号(通过执行
intz=(0xFF&byte[x])
),或者发送和接收一个
short[]
int[]
而不是
byte[]
字节[x]的x是什么意思?好的,还有一件事:当我这样做的时候“outputStream.write(CMD1)”和CMD1是一个字节=0xFF,在串行端口255或-1上发生了什么?因为可能只是java编译器,它不会像我希望的那样在控制台上进行翻译,但当我在端口com上发送时,它会向我发送255:/?Phhh…the“-1”和“255”“是二进制11111的唯一表示形式。因此,我建议不要用“-1”或“255”来思考(尽管我想,用255来思考会很容易)。这就是说,您很快就会意识到这个“-1”或“255”没有被发送,但它是一个由8个设置位(1)组成的位流。是的,没错。我在这里得到了答案: