In Java, is the result of the addition of two chars an int or a char?

当添加'a' + 'b'它产生195.输出数据类型是char还是int


The result of adding Java chars, shorts, or bytes is an int :

Java Language Specification on Binary Numeric Promotion:

  • If any of the operands is of a reference type, unboxing conversion (§5.1.8) is performed. Then:
  • If either operand is of type double, the other is converted to double.
  • Otherwise, if either operand is of type float, the other is converted to float.
  • Otherwise, if either operand is of type long, the other is converted to long.
  • Otherwise, both operands are converted to type int.
  • But note what it says about compound assignment operators (like +=):

    The result of the binary operation is converted to the type of the left-hand variable ... and the result of the conversion is stored into the variable.

    For example:

    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
    

    One way you can find out the type of the result, in general, is to cast it to an Object and ask it what class it is:

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

    If you're interested in performance, note that the Java bytecode doesn't even have dedicated instructions for arithmetic with the smaller data types. For example, for adding, there are instructions iadd (for ints), ladd (for longs), fadd (for floats), dadd (for doubles), and that's it. To simulate x += y with the smaller types, the compiler will use iadd and then zero the upper bytes of the int using an instruction like i2c ("int to char"). If the native CPU has dedicated instructions for 1-byte or 2-byte data, it's up to the Java virtual machine to optimize for that at run time.

    If you want to concatenate characters as a String rather than interpreting them as a numeric type, there are lots of ways to do that. The easiest is adding an empty String to the expression, because adding a char and a String results in a String. All of these expressions result in the String "ab" :

  • 'a' + "" + 'b'
  • "" + 'a' + 'b' (this works because "" + 'a' is evaluated first; if the "" were at the end instead you would get "195" )
  • new String(new char[] { 'a', 'b' })
  • new StringBuilder().append('a').append('b').toString()
  • String.format("%c%c", 'a', 'b')

  • charbyte (和short )的二进制算术运算提升为int - JLS 5.6.2。


    You may wish to learn the following expressions about char .

    char c='A';
    int i=c+1;
    
    System.out.println("i = "+i);
    

    This is perfectly valid in Java and returns 66 , the corresponding value of the character (Unicode) of c+1 .


    String temp="";
    temp+=c;
    System.out.println("temp = "+temp);
    

    This is too valid in Java and the String type variable temp automatically accepts c of type char and produces temp=A on the console.


    All the following statements are also valid in 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);
    

    Although c is a type of char , it can be supplied with no error in the respective constructors and all of the above statements are treated as valid statements. They produce the following outputs respectively.

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

    char is a primitive numeric integral type and as such is subject to all the rules of these beasts including conversions and promotions. You'll want to read up on this, and the JLS is one of the best sources for this: Conversions and Promotions. In particular, read the short bit on "5.1.2 Widening Primitive Conversion".

    链接地址: http://www.djcxy.com/p/73690.html

    上一篇: java的

    下一篇: 在Java中,添加两个字符的结果是int还是char?