我遇到了一个java打印字符是ASCII的情况。如果我们尝试打印两个字符,则它打印出ASCII值的总和。在Java中处理字符
System.out.println('c'); =>> c
System.out.println('a'+'b'); =>> 195 (97+98)
只是想知道为什么在第二种情况下,打印有ASCII值的总和
我遇到了一个java打印字符是ASCII的情况。如果我们尝试打印两个字符,则它打印出ASCII值的总和。在Java中处理字符
System.out.println('c'); =>> c
System.out.println('a'+'b'); =>> 195 (97+98)
只是想知道为什么在第二种情况下,打印有ASCII值的总和
在幕后,编译器是演技太聪明和更换char + char
有一个int 恒定值。
在第一种情况下println(char)
被调用,并在第二种情况下println(int)
被称为
示例代码:
public static void main(String[] args) {
System.out.println('a');
System.out.println('a' + 'b'); // the compiler first "resolves" the expression 'a'+'b' (since char cannot be added they are added as ints) and then tries to call the correct `println(int)` method.
}
字节码:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=1, args_size=1
0: getstatic #16 // Field java/lang/System.out:Ljav
/io/PrintStream;
3: bipush 97 // for single char. (pushed a byte as an int)
5: invokevirtual #22 // Method java/io/PrintStream.prin
ln:(C)V
8: getstatic #16 // Field java/lang/System.out:Ljav
/io/PrintStream;
11: sipush 195 // push sum of 2 chars as a short
14: invokevirtual #28 // Method java/io/PrintStream.prin
ln:(I)V
17: return
一个char
由int
代表在幕后,所以当你加2个字符的结果将代表int
他们的ASCII值的总和。
因为char
也可以被认为是int
。你实际做的只是添加2个整数。
在你的第一个例子System.out.println('c');
指System.out.println(char);
,但在第二个例子中'a'+'b'
是int,所以你要调用System.out.println(int);
输出作为一个字符串,将其转换为字符串
System.out.println(String.valueOf('c') + String.valueOf('b'));
Java不是像rupy/python这样的完整OO语言。基元是java最重要的部分。 所以在你的情况下,它将只使用ascii操作。 它不会连接字符,也不会传送“ab”。在单引号内提到了字符。字符串在双引号内。 如果您传递“a”+“b”=“ab”,因为您在此添加两个字符串而不是字符。
对于字符Ascii
使用了值并且这是一个int
val。还有一个int val的计算。但对于下面的情况“a”+“b”,它是串联两个字符串的stringBuilder类。 System.out.println(“a”+“b”); - > ab
*它是字符串操作符重载的方法* - 不可以。Java没有*操作符重载*之类的东西。编译器将使用'StringBuilder'来添加''a“+”b“' – TheLostMind
因为char(不是字符)是幕后的无符号整型。但是,当您添加两个char时,您将得到一个int。
你期望什么?
Java使用双引号来定义字符串文字和单引号来定义char文字 - 所以这个例子将连接两个字符串:
String strA = "a";
String strB = "b";
System.out.println(strA + strB);
..而本实施例中将打印加入2炭整数值一起的结果:
char charA = 'a';
char charB = 'b';
System.out.println(charA + charB);
的+
操作者char
被定义为它们的整数值的总和,产生一个整数。
因为你问ASCII,我们要解释的总和这样...
一个Java char
持有UTF-16编码单元的值,UTF-16是对Unicode编码,Unicode是一个超集ASCII和UTF-16对公用子集中的字符进行编码,其值与ASCII相同,在此代码中,UTF-16编码单元(两个字节)的大小与ASCII编码单元字节)无关紧要。
因此,当您将两个包含ASCII子集中的字符的char
值相加时,总和与对它们的ASCII值进行求和相同。
gg作为详细表示,很高兴知道 – Stephan
,所以如果字符的总和大于32,767,那么我假设总和将由一个int对吗? – Stephan
@Stephan - Ya ..然后'ldc'将被用来代替'sipush' :) – TheLostMind