16

このコード セグメントについて 2 つの質問があります

  1. 方法 1 は正常に機能し、方法 2 は機能しません。これの理由は何ですか?
  2. メソッド 1 では、戻り値はバイト (8 ビット) です。しかし、実際には char 値 (16 ビット) を返します。ここで実際に何が起こっているのですか?

//方法1

static byte m1() {
    final char c = 'b'-'a';
    return c; 
}

//方法 2

static byte m3(final char c) {
    return c; // 3
}
4

4 に答える 4

23

charJava では16 ビットの符号なしの値ですbyteが、 8 ビットの符号付きの値です。バイトの許容範囲は です[-128, 127]。したがって、すべての文字を に割り当てることはできませんbyte

最初のメソッドでは、コード ポイント = 1 ( ) の acharを返しています。として定義し、それに定数式を代入したので、コンパイル時定数になります。したがって、コンパイラはコンパイラエラーを出しません。'b' - 'a'charfinal

JLSセクション5.2から:

式が byte、short、char、または int 型の定数式 (§15.28) である場合:
- 変数の型が byte、short、または char であり、定数の値が式は変数の型で表現できます。

鉱山を強調します。

ただし、cnon-final にすると、コンパイル エラーも発生します。

static byte m1() {  // This will be an error
    char c = 'b'-'a';
    return c; 
}

その理由は、cもはやコンパイル時の定数ではなく、コンパイラが暗黙的なダウンキャストを行わないためです。

char2 番目のメソッドでは、渡した を返します。そこのパラメータcはコンパイル時定数ではありません。メソッドが取得する可能性のある値は、コンパイル時にはわかりません。同様に、char許可された値の範囲外のコード ポイントで a を渡すと、機能しbyteません。

2 番目の方法を機能させるには、明示的なキャストを行うことができます。

static byte m3(final char c) {
    return (byte)c; // 3
}
于 2013-08-11T10:09:11.517 に答える
2

m1()コンパイラではchar c、値が定数である1ことを認識しているため、バイトに収まることがわかっているため、文句を言いません。final char c = 128の最大サイズを 127に変更すると、から変数記述子byteを削除した場合と同様に、苦情が発生します。finalchar c

于 2013-08-11T10:14:27.353 に答える
1

方法 2 では、コンパイラはチャットからバイトへの暗黙的なキャストを狭くすることはできません。これは、精度が失われる可能性があるためです (Java は Unicode 文字をサポートし、その char プリミティブ型は 16 ビットの情報のサイズで定義されています。通常8ビットのC言語から)

ただし、方法 1 では、コンパイラは、定数値 'b'-'a' が実際には精度の損失をもたらさないことを判断できるため、暗黙的なキャストを実行できます。

見てみましょう: http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html

于 2013-08-11T10:10:02.187 に答える