在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')
对char
和byte
(和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
是一种char
types,但在各自的构造函数中可以不提供任何错误,并且上述所有语句都被视为有效的语句。 它们分别产生以下输出。
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'
执行隐式转换(从int到char的“原始缩小转换”)。
根据二元推广规则 ,如果两个操作数都不是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式在任何情况下都应该是可以互换的。 有没有人知道一个办法来理解这个?