2015-05-15 2 views
2

Я столкнулся с корпусом, в котором символом печати java являются ASCII. Если мы попытаемся напечатать два символа, тогда он напечатает сумму ASCII-значения.Обработка Chracter в 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 int? – Stephan

+1

@Stephan - Ya .. Тогда 'ldc' будет использоваться вместо' sipush' :) – TheLostMind

1

За кулисами char представлена ​​в int поэтому, когда вы добавляете 2 символов результат будет int представляющий сумма их значения ASCII.

4

Потому что char также может считаться int. То, что вы на самом деле делаете, просто добавляет 2 целых числа.

В первом примере System.out.println('c'); относится к System.out.println(char);, но во втором примере 'a'+'b' является ИНТ, так что вы звоните System.out.println(int);

для вывода в виде строки, преобразовать его в строку

System.out.println(String.valueOf('c') + String.valueOf('b'));

1

Java не является полным языком OO, как rupy/python. Примитивы - самая важная часть java. Итак, в вашем случае во втором статусе он будет использовать только операцию ascii. Это не будет согласовывать символы и не будет доставлять «ab». Чаратеры упоминаются в одинарных кавычках. Строки заключаются в двойные кавычки. Если вы передадите «a» + «b» = «ab», потому что здесь вы добавляете две строки, а не символы.

2

Для значений char Ascii используется значение int. Вычисляется добавление int val. Но для нижнего случая «a» + «b» это класс stringBuilder, который объединит две строки. System.out.println ("а" + "б"); -> AB

+0

* Это перегруженный метод струнного оператора * - Нет. В Java нет такой вещи, как * перегрузка оператора *. Компилятор будет использовать 'StringBuilder', чтобы добавить' 'a" + "b" ' – TheLostMind

2

Поскольку символ (не символов) является беззнаковым интегрального типа за кадром. Однако, когда вы добавляете два char, вы получаете int.

Что вы ожидали?

2

Java использует двойные кавычки, чтобы определить строки литералы и одинарные кавычки для определения символов символов - так что этот пример объединяет две строки:

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, сумма совпадает с суммированием их значений ASCII.

Смежные вопросы