【问题标题】:How can a Java byte variable be 128?Java字节变量怎么可能是128?
【发布时间】:2013-03-06 05:00:11
【问题描述】:

我可能错过了对 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) 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

谁能提供一些提示让我理解这一点?

已编辑:

我后来发现这只发生在英特尔 Android 模拟器上,正如我在 Joop 回答后的评论中所写的那样。

【问题讨论】:

  • byte 无法容纳128byte 的值应介于 -128127 之间。
  • 这是我的理解。 String.valueOf(foo.bProblem) 怎么会产生 128?
  • 我能想到的产生128的唯一方法是在foo.bProblem前面添加一个减号作为String.value(- foo.bProblem),其中foo.bProblem == (byte) 0x80
  • 您使用的 Java 版本是什么?
  • 编译器合规级别为1.6。

标签: java android


【解决方案1】:

String.valueOf 不占用一个字节,它采用以下之一:

布尔值 字符 字符[] 双倍的 漂浮 整数 长 对象

在您的实现中,您实际上是在调用 String.valueOf(int value) 它实际上不包含 128 的值。尝试打印

Log.d("Debug", "" + bProblem)

应该可以的。

编辑--

我想说的是 String.valueOf 实际上并没有查看字节的值。它将构成字节的相同位视为 int 并打印出来。

【讨论】:

  • 我把代码改成了Log.d("Debug", "Before: " + foo.bProblem),得到了同样的结果。
【解决方案2】:

Java“字节数据类型是一个 8 位有符号二进制补码整数。它的最小值为 -128,最大值为 127(含)。”因此,当您将一个字节分配给 +128 时,它实际上会返回到最低值 -128

详情请见http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

【讨论】:

    【解决方案3】:

    在java虚拟机中,字节字段bProblem会使用一个int。现在,使用String.valueOf(int),因为没有字节变体。所以(错误地?)该字段被视为 int,所以无符号,128。


    抱歉,我尝试达到 128 但没有成功(Java 7、Linux)

    我已经变得偏执了,您使用带有 int 字段 bProblem 的子类。或者更可能是编译的类与未编译的 java 源一起使用。也许您可以尝试使用 eclipse 以外的其他编译器。

    【讨论】:

    • 但是byte b = (byte) 0x80; System.out.println(String.valueOf(b)); 打印出-128?
    • 什么值的字节变量会导致 String.valueOf(foo.bProblem) = "128"? String.valueOf() 仅用于显示问题。我真正的问题是 foo.bProblem 无法添加到 List.
    • 没错。将 128 之类的值分配给一个字节时,到 -128 的转换是隐含的。否则会使整个语言不一致。老实说,我无法重现。
    • foo.bProblem 被分配到其他地方,我检查分配的方式与显示分配为 -128 (0x80) 的方式相同。假设这个变量在我不知道的地方搞砸了。问题是:如何给一个字节变量分配一个超出其范围的值?同样,Eclipse 显示它始终为 -128 (0x80)。
    • 重新编译所有内容?现在你也让我担心了。
    猜你喜欢
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    相关资源
    最近更新 更多