这是我的代码段:
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
???
答案 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
为-1
且11111111
为0
)。但是,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
}