Java读/写:我在这里做错了什么?

时间:2015-08-20 05:56:39

标签: java

这是我的代码段:

byte value = (byte) rand.nextInt();
TX.write(value);                    
int read = RX.read() & 0xFF;

我连接的硬件让我回想起我在TX上写的东西。 只要我写正数,那就行 但是,如果我写一个负数,我得到的东西与我写的东西不符......

请问我错过了什么?

编辑:示例输出

Write: 66
Read: 66
OK AS EXPECTED

Write: -44
Read: 212
???

Write: -121
Read: 135

Write: -51
Read: 205
???

Write: -4
Read: 252
???

4 个答案:

答案 0 :(得分:2)

如果你写了一个负字节然后你读它并使用RX.read() & 0xFF将它分配到一个int中,你将得到一个正数,因为int的符号位将为0.

尝试

int read = RX.read();

答案 1 :(得分:1)

BYTE是8位,其中1位是为标志保留的,所以最大范围是-128到127所以当你到&带负号的0xFF您将获得范围的无符号值。因此,当你做-4时,如果你做-1则给出252,那么它将给出255,依此类推。

同样在你的代码中你可以简单地使用int cast,因为它在我的最后工作.. 例如: -

   byte b = -14;
    int i = (int)b;

答案 2 :(得分:1)

似乎将int投射到byte会将int表示为signed int使用两个补码(对于一个字节,范围将是[{ {1}}] -128到127 [10000000];请注意01111111-1111111110)。但是,00000000会将RX.read()视为byte(范围从0 [unsigned int]到255 [00000000])。

如果您只使用一个字节,则可以使用:

11111111

答案 3 :(得分:1)

这是因为0xFF默认为32位的int。以-51为例。在二进制中,它使用2的补码表示:

你这样做:

                             11001101
& 00000000 00000000 00000000 FFFFFFFF

给出了

00000000 00000000 00000000 11001101

= 205

你想要的是

  11001101
& FFFFFFFF

所以你应该做

((byte) RX.read()) & ((byte) 0xFF)

参见示例:

public static void main(String[] args) {
    int negative = -51;
    System.out.println((int) (negative & (byte) 0xFF)); // = -51
    System.out.println((int) (negative & 0xFF)); // = 205
}