3

我有两个字节:

byte[0]是 0000 0000

byte[1]是 1000 0000

我想将它们放在一起并为它们制作一个浮点值。所以结果应该是十进制的 128 和二进制的 0000 0000 1000 0000。不是负数,因为前导零。

到目前为止,我的解决方案是这种方法:

float f = (bytes[0] << 8 | bytes[1]);

但这将导致值 f 的值为负 128。这是因为我猜是2s补码。因此byte[1]将被解释为否定的。我如何才能将前导位byte[0]视为负/正位?

4

2 回答 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.

于 2013-08-13T21:18:20.753 回答
3

尝试这个:

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

由于运算优先级,您需要使用括号。

一旦你有你的 16 位整数,你可以将它分配给你的浮点数:

float f = int16;

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

于 2013-08-13T21:18:39.643 回答