2

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 を List に追加したときにこれに気付きました: Java.lang.ArrayIndexOutOfBoundsException: length=256; インデックス=256

これを理解するためのヒントを誰かに教えてもらえますか?

編集:

Joopの回答に続いてコメントに書いたように、これはIntel Androidエミュレーターでのみ発生することが後でわかりました。

4

3 に答える 3

4

Java の「byte データ型は、8 ビットの符号付き 2 の補数の整数です。最小値は -128 で、最大値は 127 (両端を含む) です。」したがって、バイトを +128 に割り当てると、基本的に最小値の -128 に戻ります。

詳細については、 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.htmlを参照してください。

于 2013-03-17T22:32:24.497 に答える
4

String.valueOf does not take a byte, it takes one of the following:

boolean char char[] double float int long Object

In your implementation you are actually calling String.valueOf(int value) It does not actually contain the value of 128. Try printing

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

That should work.

EDIT--

What I'm trying to say is that String.valueOf is not actually looking at the value of the byte. It's looking at the same bits that make up the byte as an int and printing that.

于 2013-03-17T22:33:48.823 に答える
4

Java 仮想マシンでは、バイト フィールド bProblem は int を使用します。String.valueOf(int)バイトバリアントがないため、現在はが使用されています。そのため (誤って?) フィールドは int として取得されるため、符号なしの 128 になります。


申し訳ありませんが、128 を達成しようとしましたが、成功しませんでした (Java 7、Linux)

私はすでに妄想的になりました。あなたは int フィールド bProblem を持つ子クラスを使用しています。または、コンパイルされたクラスが最新のコンパイルされていない Java ソースで使用されている可能性があります。たぶん、Eclipse 以外のコンパイラを試すことができます。

于 2013-03-17T22:36:14.493 に答える