1. ホーム
  2. java

[解決済み] Javaで、2つの文字を足した結果はintかcharか?

2023-05-01 08:03:59

質問

を追加する場合 'a' + 'b' を追加すると、195が出力されます。出力されるデータ型は char なのか、それとも int ?

どのように解決するのですか?

Java chars、shorts、bytesを追加した結果は int :

2進数プロモーションに関するJava言語仕様 :

  • オペランドのいずれかが参照型の場合、箱詰め解除変換 (§5.1.8)が実行されます。その後
  • オペランドのどちらかがdouble型の場合,他方はdoubleに変換される。 はdoubleに変換されます。
  • それ以外の場合、どちらかのオペランドが float 型の場合、他方は float に変換されます。
  • そうでない場合、どちらかのオペランド がlong型であれば、他方はlongに変換されます。
  • そうでなければ、両方の オペランドはint型に変換されます。

しかし、複合代入演算子(+=など)については、次のように書かれていることに注意してください。 :

二項演算の結果を左側の変数の型に変換して・・・変換結果を変数に格納します。

例えば

char x = 1, y = 2;
x = x + y; // compile error: "possible loss of precision (found int, required char)"
x = (char)(x + y); // explicit cast back to char; OK
x += y; // compound operation-assignment; also OK

一般的に結果の型を知る方法の1つは、結果をObjectにキャストして、それがどのクラスであるかを尋ねることです。

System.out.println(((Object)('a' + 'b')).getClass());
// outputs: class java.lang.Integer

もしあなたがパフォーマンスに興味があるのであれば、以下のことに注意してください。 Javaバイトコード には、小さいデータ型での演算のための専用の命令すらありません。例えば、加算のための命令 iadd (ints用)があります。 ladd (longsの場合)。 fadd (フロート用)。 dadd (doublesの場合)、以上です。シミュレートするには x += y を小さい型でシミュレートするために、コンパイラは iadd のような命令で int の上位バイトをゼロにします。 i2c ("int to char")のような命令を使ってintの上位バイトをゼロにします。ネイティブ CPU が 1 バイトまたは 2 バイトのデータ用に専用の命令を持っている場合、実行時にそれを最適化するかどうかは Java 仮想マシンに任されています。

文字を数値型として解釈するのではなく、Stringとして連結したい場合、その方法はたくさんあります。最も簡単なのは、空のStringを式に追加することです。charとStringを追加するとStringになるからです。これらの式の結果は、すべて文字列 "ab" :

  • 'a' + "" + 'b'
  • "" + 'a' + 'b' (これは "" + 'a' が最初に評価されるからです。 "" が最後にあった場合は "195" )
  • new String(new char[] { 'a', 'b' })
  • new StringBuilder().append('a').append('b').toString()
  • String.format("%c%c", 'a', 'b')