Сложение символов в Java

Есть задача на счастливый билетик. Получаем на вход строку "123456" (строка содержит 6 целых цифр) и выводим "Счастливый" если сумма трёх первых и трех последующих чисел равны, иначе "Обычный билетик" (допустим).

  1. На ум приходит мысль о преобразовании строки в массив символов и последующее преобразование содержимого массива в целочисленную переменную, ну и произвести сложение в нужном порядке. Это работает, всё отлично.

  2. Есть более изящное для этого случая решение, это всего лишь перевести строку в массив символов и сложить символы в соответствии с таблицей системы Windows:
    0 - 48
    1 - 49
    2 - 50
    3 - 51
    4 - 52
    5 - 53
    6 - 54
    7 - 55
    8 - 56
    9 - 57
    Вот собственно рабочий код:

     var scan = new Scanner(System.in);  
     String number = scan.next();
     char[] ch = number.toCharArray();
     System.out.println(ch[0] + ch[1] + ch[2]);
     System.out.println(ch[3] + ch[4] + ch[5]);
     System.out.println(ch[0] + ch[1] + ch[2] == ch[3] + ch[4] + ch[5] ? "Lucky" : "Regular");
    

Как это работает: получаем строку "090234", складываем десятичные коды символов 48 + 57 + 48 = 153
50 + 51 + 52 = 153. Вроде как для этой задачи всё гладко и понятно. Но теперь самое интересное, почему когда я вывожу результат сложение символов через принт, то он даст результат рассчитанный выше, но если вывести цифру, например '6' результат будет 6? Вот пример:

System.out.print('2' + '3'); // 101
System.out.print('6');       // 6

Ответы (3 шт):

Автор решения: nPaBllla

При сложении символы переводятся в соответствие с таблицей кодировки, чтобы не возникала переполнения, и выводится результат, соответственно, по таблице

System.out.print('2' + '3'); // 101

Если вам надо получить символ, то можете использовать явное преобразование типов

System.out.println((char)('2'+'3')); // e

Но надо учитывать, что выведется символ соответствующий цифровому представлению в кодировке, то есть '2' + '3' = 101 = e, а НЕ '2' + '3' = '5'.

Когда же вам надо вывести отдельный символ, то он выведется просто как символ, не переводясь в кодировку

System.out.print('6');       // 6

Если же вам надо вывести код одного символа, то так же можно использовать явное преобразование

System.out.println((int)'6'); // 54
→ Ссылка
Автор решения: MaxTs27

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

→ Ссылка
Автор решения: Roman C

Потому, что вызывается перегруженный метод PrintStream::print(int).

Печатает целое число. Строка, созданная String.valueOf (int), преобразуется в байты в соответствии с кодировкой символов платформы по умолчанию, и эти байты записываются точно так же, как метод write (int).

То есть в зависимости от типа аргумента вызывается соответствующий метод. В первом случае тип аргумента int, получается как результат вычисления выражения, а во втором - char.

Вот его описание PrintStream::print(char)

Печатает символ. Символ преобразуется в один или несколько байтов в соответствии с кодировкой символов платформы по умолчанию, и эти байты записываются точно так же, как метод write (int).

Теперь нетрудно заметить разницу.

→ Ссылка