6

私はJavaを学んでいます。式を正しく行うには、式を特定の型にキャストする必要があることがよくあります。たとえば、算術評価中、バイトは整数に昇格されるため、次の式はエラーをスローします。

byte b = 10;
int i;
i = b*b;  //ok, assigning an integer evaluation to an integer variable
b = b*b;  // throws error, coz assigning integer evaluation to byte variable

これで、文字変数に整数を代入しても問題ないことがわかりました。問題ありませんchar a; a = 88;。ただし、これを行うと:

char c2 = 'b', c3 = 'c';
c2 = c2 + c3; //throws error
c2 = (char)(c2 + c3); //works fine

キャストされていないときにエラーがスローされるのはなぜですか? 結局、右辺は依然として整数であるため、整数を文字変数に代入することは問題なく機能するはずです。

4

8 に答える 8

6

ではc2 + c3、両方のオペランドが暗黙的に に拡張されるintため、加算の結果も になりintます。

JLS§15.18.2。数値型の加算演算子 (+ および -) :

バイナリ数値昇格は、オペランドで実行されます (§5.6.2)。

JLS§5.6.2。2 進数昇格:

演算子がバイナリ数値昇格をオペランドのペアに適用する場合、各オペランドは数値型に変換可能な値を示す必要があります。次の規則が順番に適用されます。

拡張プリミティブ変換 (§5.1.2) は、次の規則で指定されているように、オペランドの一方または両方を変換するために適用されます。

  • いずれかのオペランドが double 型の場合、もう一方は double に変換されます。

  • それ以外の場合、いずれかのオペランドが float 型の場合、もう一方は float に変換されます。

  • それ以外の場合、いずれかのオペランドが long 型の場合、もう一方は long に変換されます。

  • それ以外の場合、両方のオペランドが int 型に変換されます。

したがって、あなたはint. 変数に割り当てるにcharは、明示的なキャストが必要です。

あなたは言う:

文字変数には整数値を代入できるので...

キャストなしで変数に代入できるのは定数整数式のみです。char

JLS§5.2。割り当ての変換:

さらに、式が byte、short、char、または int 型の定数式 (§15.28) である場合:

  • 変数の型が byte、short、または char であり、定数式の値が変数の型で表現できる場合は、縮小プリミティブ変換を使用できます。

この自動縮小変換はここでは適用されません。明示的なキャストが必要です。

于 2012-12-19T11:34:06.727 に答える
3

int を char に割り当てても、必ずしもうまくいくとは限りません。char は 16 ビットのみで、int は 32 ビットであるため、オーバーフローが発生する可能性があります。

一般に、Java では、割り当ての結果としてオーバーフローが発生しない場合にのみ、キャストなしでプリミティブ値を割り当てることができます。

于 2012-12-19T11:34:08.163 に答える
1
char c2 = 'b', c3 = 'c';
c2 = c2 + c3; //throws error
c2 = (char)(c2 + c3); //works fine

あなたがしているときc2+ c3

これらの文字のASCII値が追加され、int結果が返されます。int結果を割り当てるchar とエラーが発生します。

于 2012-12-19T11:36:19.107 に答える
0

charは2バイト、intは4バイトです。char c=1と書くと; 1がintであることを意味するのではなく、javacの定数であり、javacは1がcharに適合することを認識しています。しかし、c2 = c2 + c3; は算術演算であり、javacはそれを次のように解釈し(int)c2 + (int)c3、これによりintの結果が生成されます。intはcharに適合しないため、javacは精度が失われる可能性があることを警告します。

于 2012-12-19T11:39:27.990 に答える
0

スレッドを見てください:

charおよび整数リテラルを使用したJavaの整数演算

その理由は「c2=c2+c3;」ということのようです。「chara;a= 88;」に対して、コンパイラはチェックできません(実行時に実行されます)。コンパイラによって直接実行されます。

于 2012-12-19T11:39:37.417 に答える
0

コンパイラが値を決定できるため、int88をcharに割り当てることは機能します。

c2 = c2 + c3の場合は、コンパイラーでは処理できません。値c2+c3は、実行時に評価する必要があります。したがって、コンパイラーは、割り当てられる必要のある実際のchar値を判別できません。

于 2012-12-19T11:35:57.633 に答える
0

さらに明確にするための例:

char c1 = Character.MAX_VALUE;
char c2 = Character.MAX_VALUE;
char c3 = (char) (c1 + c2);
int  i3 = c1 + c2;

System.out.printf("After casting to char: %s, the int value: %s%n", (int) c3, i3);

したがって、キャストを使用すると、実際には間違った数学的な結果が得られました。

于 2012-12-19T11:45:07.130 に答える
0

Java で各基本型が保持できる値には一定の制限があります。算術演算の結果を代入すると、実行時に予測できない結果が生成される可能性があり、JVM は char が保持できるかどうかわからないため、コンパイル エラーが発生します。

于 2012-12-19T11:52:38.300 に答える