2015-05-15 91 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值進行求和相同。