解决所有Java字节都已签名这一事实的最佳方法是什么?

时间:2008-08-14 14:14:04

标签: java byte unsigned signed

在Java中,没有无符号字节。

使用某些低级代码时,有时需要处理大于128的无符号值的字节,这会导致Java将其解释为负数,因为MSB用于符号。

解决这个问题的好方法是什么? (说不要使用Java不是一种选择)

7 个答案:

答案 0 :(得分:78)

如果你这样做,实际上可以摆脱if语句和添加。

byte[] foobar = ..;
int value = (foobar[10] & 0xff);

这样,Java不会将字节解释为负数,也会翻转整数上的符号位。

答案 1 :(得分:19)

当从数组中读取任何单个值时,将其复制为short或int之类的东西,并手动将负数转换为正值。

byte[] foobar = ..;
int value = foobar[10];
if (value < 0) value += 256 // Patch up the 'falsely' negative value

写入数组时可以进行类似的转换。

答案 2 :(得分:1)

使用int通常比使用short更好,因为java无论如何都在内部使用32位值(即使是字节,除非在数组中),因此使用int将避免在字节码中对短值进行不必要的转换。

答案 3 :(得分:0)

可能你最好的选择是使用整数而不是字节。它有足够的空间来容纳大于128的数字,而无需创建一个特殊对象来替换字节。

这也是比我聪明的人(每个人)所建议的

答案 4 :(得分:0)

执行位操作/无符号字节的最佳方法是使用 int 。即使它们已经签名,它们也有足够的备用位(总共32位)作为无符号字节。此外,所有数学运算符都会将较小的固定精度数转换为 int 。例如:

short a = 1s;
short b = 2s;
int c = a + b; // the result is up-converted
short small = (short)c; // must cast to get it back to short

因此,最好只使用整数并屏蔽它以获得您感兴趣的位。例如:

int a = 32;
int b = 128;
int foo = (a + b) | 255;

以下是有关Java基元类型http://mindprod.com/jgloss/primitive.html

的更多信息

最后一个简单的注释,Java中有一个无符号的固定精度数。那是 char 原语。

答案 5 :(得分:0)

我知道这是一个非常晚的回复,但是当我尝试做同样的事情时,我遇到了这个帖子。问题只是试图确定Java字节是否> 127。

简单的解决方案是:

if((val & (byte)0x80) != 0) { ... }

如果真正的问题是&gt; 128,那么只需在if语句中添加另一个条件即可。

答案 6 :(得分:-1)

我想你可以用短片来存储它们。不是很有效率,但除了我所看到的一些艰巨的努力之外,它真的是唯一的选择。