将两个字节转换为16位有符号数字

3
我得到了两个字节: byte[0]是0000 0000 byte[1]是1000 0000
我想把它们合在一起,形成一个浮点数值。所以结果应该是十进制的128和二进制的0000 0000 1000 0000。不是负数,因为有前导零。
到目前为止,我的解决方案是这样的:
float f = (bytes[0] << 8 | bytes[1]);

但是这将导致值f的值为负128。我猜是因为2的补码。因此byte[1]将被解释为负数。如何将byte[0]的最高位视为正/负位?

2个回答

3

由于您正在执行某些扩展转换,因此必须停止由于使用二进制补码而导致的前导1位的传播:

byte[] bytes = {0, -128}; // bytes[0] = 0000 0000, bytes[1] = 1000 0000
short s = (short) (((bytes[0] & 0xFF) << 8) | (bytes[1] & 0xFF));
System.out.println(s); // prints 128

此外,float 用于浮点数,由于您想要一个16位的十进制数,因此我将目标数据类型更改为 short

3

试试这个:

short int16 = (short)(((bytes[0] & 0xFF) << 8) | (bytes[1] & 0xFF));

由于操作优先级,您需要使用括号。

一旦您拥有了16位整数,就可以将其赋值给浮点数:

float f = int16;

是的,你本来可以一步完成,但我想一步步来。

我遇到了类似的问题,但我有四个16位寄存器,需要得到长整型值。你能帮我吗? - Josef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接