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

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

添加Java字符,短语或字节的结果是int

二进制数字推广的Java语言规范 :

  • 如果任何操作数是引用types,则执行拆箱转换(§5.1.8)。 然后:
  • 如果其中一个操作数的types是double,另一个则转换为double。
  • 否则,如果任一操作数的types为float,则另一个操作数转换为float。
  • 否则,如果任一操作数的types是long,则另一个操作数转换为long。
  • 否则,两个操作数都转换为inttypes。

但是请注意关于复合赋值运算符(如+ =)的含义 :

二进制运算的结果被转换为左边variables的types,并且转换的结果被存储到variables中。

例如:

 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 

一般来说,你可以找出结果types的一种方法是把它转换成一个对象,并询问它是什么类:

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

如果您对性能感兴趣,请注意, Java字节码甚至没有用于较小数据types的算术专用指令。 例如,添加指令iadd (int), ladd (longs), fadd (float), dadd (double),就是这样。 为了用较小的types来模拟x += y ,编译器将使用iadd ,然后使用诸如i2c (“int to char”)的指令将int的高位字节清零。 如果本地CPU具有1字节或2字节数据的专用指令,则由Java虚拟机在运行时对其进行优化。

如果要将字符连接成一个string,而不是将它们解释为一个数字types,有很多方法可以做到这一点。 最简单的是向expression式添加一个空string,因为添加一个字符和一个string导致一个string。 所有这些expression式导致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')

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

您可能希望了解有关char的以下expression式。

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

这在Java中是完全有效的,并返回66 ,即c+1的字符(Unicode)的对应值。


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

这在Java中是非常有效的,而Stringtypesvariablestemp自动接受chartypes的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); 

尽pipec是一种chartypes,但在各自的构造函数中可以不提供任何错误,并且上述所有语句都被视为有效的语句。 它们分别产生以下输出。

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

char是一个原始的数字整数types,因此受制于这些野兽的所有规则,包括转换和促销。 你需要阅读这个,JLS是最好的来源之一: 转换和促销 。 特别是阅读“5.1.2扩展原始转换”中的简短位。

Java编译器可以将它解释为一个。

通过编写程序并查找编译器错误来检查它:

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

如果是字符,那么第一行会给我一个错误,第二行不会。 如果它是一个整数,则会发生相反的情况。

我编译它,我得到了…..没有错误。 所以Java接受这两个。

但是,当我印刷他们时,我得到了:

int:195

char:Ã

发生什么事是,当你这样做:

 char result2 = 'a' + 'b' 

执行隐式转换(从intchar的“原始缩小转换”)。

根据二元推广规则 ,如果两个操作数都不是double,float或long,则两者都提升为int。 不过,我强烈build议不要将字符types作为数字来处理,这种方式会打败它的目的。

虽然你已经有了正确的答案(在JLS中引用),但是在添加两个char时,有一些代码用于validation是否获得了int

 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表示为Unicode值,其中Unicode值由\u后面跟着Hexadecimal值表示。

由于char值的任何算术运算都被提升为int ,所以'a' + 'b'被计算为

1.)使用Unicode Table在相应的char上应用Unicode

2.)将hex应用于十进制转换,然后对Decimal值执行操作。

  char Unicode Decimal a 0061 97 b 0062 98 + 195 

Unicode To Decimal Converter

 0061 

(0 * 16 3 )+(0 * 16 2 )+(6 * 16 1 )+(1 * 16 0

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

0 + 0 + 96 + 1 = 97

 0062 

(0 * 16 3 )+(0 * 16 2 )+(6 * 16 1 )+(2 * 16 0

(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 % 

不过这是一件奇怪的事情。 以下编译:

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

但是这不是:

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

看来,通过以下testing,两个expression式('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()); 

那为什么第二种情况不能编译? 顺便提一下,你可以通过将整个expression式转换为char来修复它:

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

这似乎是Java语义的不一致 – 任何charexpression式在任何情况下都应该是可以互换的。 有没有人知道一个办法来理解这个?