'a' + 'b'
を追加すると、195が生成されます。出力データ型はchar
またはint
ですか?
Java chars、shorts、またはbytesを追加した結果はint:
- オペランドのいずれかが参照型の場合、ボックス化解除変換(§5.1.8)が実行されます。次に:
- いずれかのオペランドが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つの方法は、結果をオブジェクトにキャストし、それがどのクラスであるかを尋ねることです。
_System.out.println(((Object)('a' + 'b')).getClass());
// outputs: class Java.lang.Integer
_
パフォーマンスに関心がある場合は、 Javaバイトコード には、より小さいデータ型の算術専用の命令さえないことに注意してください。たとえば、追加するには、iadd
(intの場合)、ladd
(longの場合)、fadd
(floatの場合)、dadd
(forの場合)の命令があります。 doubles)、それだけです。小さい型で_x += y
_をシミュレートするには、コンパイラはiadd
を使用し、_i2c
_( "int to char")のような命令を使用してintの上位バイトをゼロにします。ネイティブCPUに1バイトまたは2バイトのデータ専用の命令がある場合、実行時に最適化するのはJava仮想マシン次第です。
文字を数値型として解釈するのではなく、文字列として連結する場合は、多くの方法があります。最も簡単なのは、空の文字列を式に追加することです。これは、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')
char
およびbyte
(およびshort
)のバイナリ算術演算は、int
に昇格します-JLS 5.6.2。
char
について次の式を学習することをお勧めします。
char c='A';
int i=c+1;
System.out.println("i = "+i);
これはJavaで完全に有効であり、66
の文字(Unicode)の対応する値であるc+1
を返します。
String temp="";
temp+=c;
System.out.println("temp = "+temp);
これはJavaで有効です。String型変数temp
は自動的にchar型のc
を受け入れ、コンソールでtemp=A
を生成します。
次のステートメントはすべて、Javaでも有効です!
Integer intType=new Integer(c);
System.out.println("intType = "+intType);
Double doubleType=new Double(c);
System.out.println("doubleType = "+doubleType);
Float floatType=new Float(c);
System.out.println("floatType = "+floatType);
BigDecimal decimalType=new BigDecimal(c);
System.out.println("decimalType = "+decimalType);
Long longType=new Long(c);
System.out.println("longType = "+longType);
c
はchar
の型ですが、それぞれのコンストラクターでエラーなしで提供でき、上記のすべてのステートメントは有効なステートメントとして扱われます。それぞれ次の出力が生成されます。
intType = 65
doubleType = 65.0
floatType = 65.0
decimalType = 65
longType =65
char
はプリミティブな数値積分型であり、変換やプロモーションを含むこれらの獣のすべての規則に従います。あなたはこれを読みたいと思うでしょう、そして、JLSはこれのための最高のソースの1つです: Conversions and Promotions 。特に、「5.1.2 Widening Primitive Conversion」の短いビットを読んでください。
Javaコンパイラはそれをどちらかとして解釈できます。
プログラムを作成し、コンパイラエラーを探して確認します。
public static void main(String[] args) {
int result1 = 'a' + 'b';
char result2 = 'a' + 'b';
}
文字の場合、最初の行でエラーが発生し、2番目の行でエラーが発生しません。 intの場合、逆のことが起こります。
私はそれをコンパイルしました...エラーなし。 したがってJavaは両方を受け入れます。
しかし、それらを印刷したとき、私は得ました:
int:195
char:Ã
何が起こるかというと、次のようになります:
char result2 = 'a' + 'b'
暗黙的な変換が実行されます(intからcharへの「プリミティブナローイング変換」)。
バイナリプロモーションルール によると、どちらのオペランドもdouble、float、またはlongのいずれでもない場合、両方がintに昇格されます。ただし、char型を数値として扱うことは強くお勧めしますが、この種の目的は無効です。
char
は Unicode
値として表され、Unicode値は\u
の後に Hexadecimal
値。
char
値の算術演算はint
に昇格するため、'a' + 'b'
の結果は次のように計算されます。
1.) Unicode Table
を使用して、対応するUnicode
にchar
値を適用します
2.) 16進数から10進数 変換を適用し、Decimal
値に対して操作を実行します。
char Unicode Decimal
a 0061 97
b 0062 98 +
195
例
0061
(0 * 163)+(0 * 162)+(6 * 161)+(1 * 16)
(0 * 4096)+(0 * 256)+(6 * 16)+(1 * 1)
0 + 0 + 96 + 1 = 97
0062
(0 * 163)+(0 * 162)+(6 * 161)+(2 * 16)
(0 * 4096)+(0 * 256)+(6 * 16)+(2 * 1)
0 + 0 + 96 + 2 = 98
したがって、97 + 98 = 195
例2
char Unicode Decimal
Ջ 054b 1355
À 00c0 192
--------
1547 +
1163 -
7 /
260160 *
11 %
正しい答えはすでにありますが(JLSで参照)、2つのint
を追加するときにchar
を取得することを確認するためのコードを次に示します。
public class CharAdditionTest
{
public static void main(String args[])
{
char a = 'a';
char b = 'b';
Object obj = a + b;
System.out.println(obj.getClass().getName());
}
}
出力は
Java.lang.Integer
ただし、奇妙なことがあります。次のコンパイル:
char x;
x = 'a' + 'b';
しかし、これはそうではありません:
char x;
x = 'a';
x = x + 'b';
次のテストにより、両方の式( 'a' + 'b'およびx + 'b')が整数になるように見えます。
Object obj = 'a'+'b';
System.out.println(obj.getClass().getName());
char x = 'a';
Object obj2 = x+'b';
System.out.println(obj2.getClass().getName());
では、なぜ2番目のケースがコンパイルされないのでしょうか?ちなみに、式全体をcharとしてキャストすることで修正できます。
x = (char)(x+'b');
これはJava-任意のchar式は任意のコンテキストで別のchar式と交換可能である必要があります。これを理解する方法を知っている人はいますか?