2

次のサンプル コードを記述します。

public static void main(String[] args) throws Exception
{
      byte number_1 =  127;
      byte number_2 =  (byte) 128;
      System.out.println("number_1 = " + number_1);
      System.out.println("number_2 = " + number_2);
}

出力に次の結果が得られます。

number_1 = 127
number_2 = -128

byteデータ型の範囲 ( -128~ )を知っています127。私のサンプルは正しいですか?どうしたの?2 の補数演算はありますか? この振る舞いがわかりません。

4

6 に答える 6

12

1 バイトは -128 から 127 までしか保持できないため、これはオーバーフローの予想される動作です。

このループで確認

for(int index = 0 ; index < 258 ; index ++ ){
  System.out.println((byte)index);
}

数直線

こちらもご覧ください

于 2012-06-25T05:45:40.220 に答える
4

これはバイト範囲によるものです。1 バイトは -128 から 127 までの値のみを格納できます。

于 2012-06-25T05:46:52.407 に答える
1

プリミティブ データ型に関する公式ドキュメントから:

byte: byte データ型は、8 ビットの符号付き 2 の補数整数です。最小値は -128 で、最大値は 127 (両端を含む) です。

あなたの質問に答えるには: Java で 127 より大きい int バイト変数を設定する方法は?

符号なしバイトを表す最良の方法は、符号付き整数を使用することです。Java VM はバイトを 32 ビットとして表すため、バイトを使用しても何も保存されません。

于 2012-06-25T05:48:39.577 に答える
1

縮小プリミティブ変換の効果が見られます。整数リテラル128byte結果にキャストすると、最後のバイト以外はすべてスローされます。整数の最後のバイトの値は で、 2 の補数で 1 バイト値として10000000解釈するとになります。 -128

対照的に、左側がゼロで埋められた 4 バイト値として解釈される同じ値、つまり00000000 00000000 00000000 10000000equals 128

于 2012-06-25T05:51:18.803 に答える
0

最後のバイト数は 127 で最初のバイト数は -128 なので、128 のときは -128 になり、129 のときは -127 になります.. 再び 127 になるまで続き、再びループして - になります。 128..それは私が理解していることです..私はそれが明確であることを望みます..

于 2013-11-05T11:39:06.067 に答える
0

1 バイトは -128 から 127 までしか保持できないため、127 を超えるまたは -127 未満の int を変換すると、Java コンパイラは自動的に変更を行います。実際、次のステートメント

byte number_2 =  (byte) 128;

に変更されました

byte number_2 =  (byte) -128;

javap を使用してバイトコードをチェックアウトすると、それが見つかります。

于 2012-06-25T06:06:51.233 に答える