[解決済み] Javaで、2つの文字を足した結果はintかcharか?
質問
を追加する場合
'a' + 'b'
を追加すると、195が出力されます。出力されるデータ型は
char
なのか、それとも
int
?
どのように解決するのですか?
Java chars、shorts、bytesを追加した結果は int :
- オペランドのいずれかが参照型の場合、箱詰め解除変換 (§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')
関連
-
JDK8 の Optional.of と Optional.ofNullable メソッドの違いと使い方を説明する。
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Java の配列を表示する最も簡単な方法は何ですか?
-
[解決済み] 特定のUnicode文字を含むコメントでのJavaコードの実行が許可されているのはなぜですか?
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
undefined[sonar] sonar:デフォルトのスキャンルール
-
StringBuilderが投げるArrayIndexOutOfBoundsExceptionの探索
-
Jsoup-Crawlingの動作
-
unsigned char* から const jbyte* {aka const signed char*} への変換が無効です。
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
-
BindException: アドレスはすでに使用中です:バインドエラー解決
-
セミコロン期待値エラー解決
-
java.sql.SQLException: 結果セットの開始前
-
eclipse にリソースリーク:'in' が閉じない
-
Java基礎 - マッピングとQ/A