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

感情迁移 提交于 2019-11-26 00:20:48

问题


When adding \'a\' + \'b\' it produces 195. Is the output datatype char or int?


回答1:


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



回答2:


Binary arithmetic operations on char and byte (and short) promote to int -- JLS 5.6.2.




回答3:


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".




回答4:


The Java compiler can interpret it as either one.

Check it by writing a program and looking for compiler errors:

public static void main(String[] args) {
    int result1 = 'a' + 'b';
    char result2 = 'a' + 'b';
}

If it's a char, then the first line will give me an error and the second one will not. If it's an int, then the opposite will happen.

I compiled it and I got..... NO ERRORS. So Java accepts both.

However, when I printed them, I got:

int: 195

char: Ã

What happens is that when you do:

char result2 = 'a' + 'b'

an implicit conversion is performed (a "primitive narrowing conversion" from int to char).




回答5:


According to the binary promotion rules, if neither of the operands is double, float or long, both are promoted to int. However, I strongly advice against treating char type as numeric, that kind of defeats its purpose.




回答6:


While you have the correct answer already (referenced in the JLS), here's a bit of code to verify that you get an int when adding two chars.

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

The output is

java.lang.Integer




回答7:


char is represented as Unicode values and where Unicode values are represented by \u followed by Hexadecimal values.

As any arithmetic operation on char values promoted to int , so the result of 'a' + 'b' is calculated as

1.) Apply the Unicode values on corresponding char using Unicode Table

2.) Apply the Hexadecimal to Decimal conversion and then perform the operation on Decimal values.

    char        Unicode      Decimal
     a           0061          97
     b           0062          98  +
                              195

Unicode To Decimal Converter

Example

0061

(0*163) + (0*162) + (6*161) + (1*160)

(0*4096) + (0*256) + (6*16) + (1*1)

0 + 0 + 96 + 1 = 97

0062

(0*163) + (0*162) + (6*161) + (2*160)

(0*4096) + (0*256) + (6*16) + (2*1)

0 + 0 + 96 + 2 = 98

Hence 97 + 98 = 195


Example 2

char        Unicode      Decimal
 Ջ           054b         1355
 À           00c0          192 
                      --------
                          1547    +
                          1163    -
                             7    /
                        260160    *
                            11    %



回答8:


Here's something strange, though. The following compiles:

char x;
x = 'a' + 'b';

But this does not:

char x;
x = 'a';
x = x + 'b';

It would appear that both expressions ('a'+'b' and x+'b') result in integers, by the following test:

Object obj = 'a'+'b';
System.out.println(obj.getClass().getName());

char x = 'a';
Object obj2 = x+'b';
System.out.println(obj2.getClass().getName());

So why would the second case not compile? Incidentally, you can fix it by casting the entire expression as a char:

x = (char)(x+'b');

This seems like an inconsistency in the semantics of Java - any char expression ought to be interchangeable with another in any context. Does anyone know of a way to make sense of this?



来源:https://stackoverflow.com/questions/8688668/in-java-is-the-result-of-the-addition-of-two-chars-an-int-or-a-char

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!