Java字节变量怎么可能是128?
我可能错过了对Java中字节的一些基本理解。以下是一个应用程序的简化摘录,以说明问题:Java字节变量怎么可能是128?,java,android,Java,Android,我可能错过了对Java中字节的一些基本理解。以下是一个应用程序的简化摘录,以说明问题: public class Foo { byte b1; byte b2; byte bProblem; } foo是foo的一个实例。以下几点让我困惑了几个小时: Log.d("Debug", "Before: " + String.valueOf(foo.bProblem)); if (foo.bProblem != (byte) 0x80) { foo.bProblem = (byte)
public class Foo
{
byte b1;
byte b2;
byte bProblem;
}
foo是foo的一个实例。以下几点让我困惑了几个小时:
Log.d("Debug", "Before: " + String.valueOf(foo.bProblem));
if (foo.bProblem != (byte) 0x80) {
foo.bProblem = (byte) 0x80;
Log.d("Debug", "After: " + String.valueOf(foo.bProblem));
}
LogCat显示以下内容:
03-17 21:58:46.590: D/Debug(2130): Before: 128
03-17 21:58:46.590: D/Debug(2130): After: -128
Eclipse的调试器对于foo.bProblem总是显示-128(0x80)。这意味着调试器无法看到String.valueOf()显示的内容。Java字节怎么可能是128
在将foo.bProblem添加到列表时,我注意到这一点:
Java.lang.ArrayIndexOutOfBoundsException:长度=256;索引=256
有人能给我一些提示让我明白这一点吗
编辑:
后来,我发现这种情况只发生在英特尔安卓仿真器上,正如我在Joop回答后的评论中所写的那样。Java“字节数据类型是一个8位带符号的2的补码整数。它的最小值为-128,最大值为127(含)。”因此,当您将一个字节分配给+128时,它实际上会返回到最低值-128
有关详细信息,请参阅。String.valueOf不接受一个字节,它接受以下内容之一:
03-17 21:58:46.590: D/Debug(2130): Before: 128
03-17 21:58:46.590: D/Debug(2130): After: -128
布尔值
烧焦
字符[]
双重的
浮动
int
长的
反对
在您的实现中,实际上是在调用String.valueOf(int-value)
它实际上不包含128的值。试着打印
Log.d("Debug", "" + bProblem)
这应该行得通
编辑--
我想说的是,String.valueOf实际上并不是在看字节的值。在java虚拟机中,字节字段bProblem将使用int。现在,
String。使用valueOf(int)
,因为没有字节变量。因此(错误地?)该字段被视为int,因此无符号,128
对不起,我试图实现128,但没有成功(Java 7,Linux)
我已经变得多疑了,你用一个带int字段的子类来解决这个问题。或者更可能是一个已编译的类与一个未进行最新编译的java源一起使用。也许您可以尝试eclipse以外的其他编译器。
byte
无法容纳128
!字节的值
应该介于-128
和127
之间。这是我的理解。String.valueOf(foo.bProblem)如何生成128?我能想到的生成128
的唯一方法是在foo.bProblem
前面加一个减号,作为String.value(-foo.bProblem)
,其中foo.bProblem==(字节)0x80
。您使用的Java版本是什么?编译器符合性级别是1.6。我将代码更改为Log.d(“Debug”,“Before:”+foo.bProblem),并得到了相同的结果。但是字节b=(byte)0x80;System.out.println(String.valueOf(b))
打印-128
?字节变量的哪个值会导致String.valueOf(foo.bProblem)=“128”?valueOf()仅用于显示问题。我真正的问题是不能将foo.b问题添加到列表中。当将类似128的值赋给一个字节时,到-128的转换是隐式的。否则会使整个语言不一致。老实说,我无法重现.foo.bProblem被分配到其他地方的情况,我以相同的方式检查了分配,显示它被分配到了-128(0x80)。假设这个变量在某个我不知道的地方出错了。问题是:一个字节变量如何通过赋值超出其作用域?同样,Eclipse显示它总是-128(0x80)?现在你也让我担心了。