web-dev-qa-db-ja.com

Javaでは、2つの文字を追加した結果はintまたはcharですか?

'a' + 'b'を追加すると、195が生成されます。出力データ型はcharまたはintですか?

71
orange

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

バイナリ数値プロモーションのJava言語仕様

  • オペランドのいずれかが参照型の場合、ボックス化解除変換(§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')
122
Boann

charおよびbyte(およびshort)のバイナリ算術演算は、intに昇格します-JLS 5.6.2。

20
Hot Licks

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);

ccharの型ですが、それぞれのコンストラクターでエラーなしで提供でき、上記のすべてのステートメントは有効なステートメントとして扱われます。それぞれ次の出力が生成されます。

intType = 65
doubleType = 65.0
floatType = 65.0
decimalType = 65
longType =65

charはプリミティブな数値積分型であり、変換やプロモーションを含むこれらの獣のすべての規則に従います。あなたはこれを読みたいと思うでしょう、そして、JLSはこれのための最高のソースの1つです: Conversions and Promotions 。特に、「5.1.2 Widening Primitive Conversion」の短いビットを読んでください。

7
Lion

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への「プリミティブナローイング変換」)。

3
eboix

バイナリプロモーションルール によると、どちらのオペランドもdouble、float、またはlongのいずれでもない場合、両方がintに昇格されます。ただし、char型を数値として扱うことは強くお勧めしますが、この種の目的は無効です。

2
Sergei Tachenov

charUnicode 値として表され、Unicode値は\uの後に Hexadecimal 値。

char値の算術演算はintに昇格するため、'a' + 'b'の結果は次のように計算されます。

1.) Unicode Table を使用して、対応するUnicodechar値を適用します

2.) 16進数から10進数 変換を適用し、Decimal値に対して操作を実行します。

    char        Unicode      Decimal
     a           0061          97
     b           0062          98  +
                              195

Unicode To Decimal Converter

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    %
1
Pavneet_Singh

正しい答えはすでにありますが(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

1
Paul

ただし、奇妙なことがあります。次のコンパイル:

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式と交換可能である必要があります。これを理解する方法を知っている人はいますか?

0
Sam Scott