2015-05-15 56 views
2

我遇到了一个java打印字符是ASCII的情况。如果我们尝试打印两个字符,则它打印出ASCII值的总和。在Java中处理字符

System.out.println('c'); =>> c 
System.out.println('a'+'b'); =>> 195 (97+98) 

只是想知道为什么在第二种情况下,打印有ASCII值的总和

回答

3

在幕后,编译器是演技太聪明和更换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 
+1

gg作为详细表示,很高兴知道 – Stephan

+0

,所以如果字符的总和大于32,767,那么我假设总和将由一个int对吗? – Stephan

+1

@Stephan - Ya ..然后'ldc'将被用来代替'sipush' :) – TheLostMind

1

一个charint代表在幕后,所以当你加2个字符的结果将代表int他们的ASCII值的总和。

4

因为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'));

1

Java不是像rupy/python这样的完整OO语言。基元是java最重要的部分。 所以在你的情况下,它将只使用ascii操作。 它不会连接字符,也不会传送“ab”。在单引号内提到了字符。字符串在双引号内。 如果您传递“a”+“b”=“ab”,因为您在此添加两个字符串而不是字符。

2

对于字符Ascii使用了值并且这是一个int val。还有一个int val的计算。但对于下面的情况“a”+“b”,它是串联两个字符串的stringBuilder类。 System.out.println(“a”+“b”); - > ab

+0

*它是字符串操作符重载的方法* - 不可以。Java没有*操作符重载*之类的东西。编译器将使用'StringBuilder'来添加''a“+”b“' – TheLostMind

2

因为char(不是字符)是幕后的无符号整型。但是,当您添加两个char时,您将得到一个int

你期望什么?

2

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); 
0

+操作者char被定义为它们的整数值的总和,产生一个整数。

因为你问ASCII,我们要解释的总和这样...

一个Java char持有UTF-16编码单元的值,UTF-16是对Unicode编码,Unicode是一个超集ASCII和UTF-16对公用子集中的字符进行编码,其值与ASCII相同,在此代码中,UTF-16编码单元(两个字节)的大小与ASCII编码单元字节)无关紧要。

因此,当您将两个包含ASCII子集中的字符的char值相加时,总和与对它们的ASCII值进行求和相同。