我遇到了一個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