Вычисление с переменной char в java

У меня есть задание для школы, и одна из задач состоит в том, чтобы объяснить множество крошечных вычислений и объяснить, почему java дает вам результат, который она дает вам.

и один из расчетов:

1 + '2' + 3

что для меня дает лексическую ошибку, так как учитель использовал неправильные «апострофы» для моей системы, но я разговаривал с другими однокурсниками, и они сказали мне, что получили реальный результат, поэтому я начал читать об этом и узнал что он должен обозначать переменную char, и я также узнал о конкретных типах системы, поэтому я изменил знаки, чтобы они работали для моей системы, и теперь я получаю ответ 54..

и я не вижу в этом логики, и я пытался добавить/вычислить/математику Google с переменными char и не нашел ничего, что бы это хорошо объясняло.

Поэтому я обращаюсь к вам, людям, занимающимся кодированием, частью которых я когда-нибудь мог бы стать, чтобы помочь мне понять логику этого...

это началось как домашнее задание, которое я, вероятно, мог бы выполнить, просто ответив, что оно дает лексическую ошибку, потому что мой компилятор не понимает символ, но теперь мое любопытство достигло пика, и я действительно хочу знать, как java удается получить этот ответ..

спасибо за любую помощь в этом вопросе! :)

Я вижу, что не смог сделать тег «домашнее задание», поэтому надеюсь, что я поместил его здесь :)


person Petter Emil Anderssen    schedule 31.08.2014    source источник
comment
stackoverflow .com/questions/3680625/   -  person assylias    schedule 31.08.2014
comment
возможный дубликат преобразования int в char в java   -  person Dici    schedule 31.08.2014
comment
Когда вы добавляете более широкий шрифт к узкому, в результате вы получаете более широкий шрифт. 1 соответствует int и шире, чем char, поэтому следует ожидать результат int.   -  person Peter Lawrey    schedule 31.08.2014


Ответы (2)


В Java chars имеют прямое сопоставление с ints с помощью UTF-16. Однако для наиболее распространенных символов приведение значения char к int дает его индекс в таблице ascii. + не является операцией с символами, но операцией с целыми числами. Поэтому java берет 2 и, подумав: «Я не могу добавить это», понимает, что может добавить его, если приведет к типу int. Таблица Ascii

Как вы можете видеть в таблице, «2» имеет индекс 50, таким образом, 1 + 50 + 3 = 54.

person Mshnik    schedule 31.08.2014
comment
Этот! ха-ха, вот почему! Большое спасибо, это очень хорошо объясняет! это значит, что сегодня я буду хорошо спать.. еще раз спасибо! - person Petter Emil Anderssen; 31.08.2014
comment
Без проблем! Примите ответ, когда сможете! - person Mshnik; 31.08.2014
comment
Java использует Unicode, а не ASCII! В строках и символах используется кодировка Unicode, называемая UTF-16. Символ — это одна единица кода UTF-16, одна или две из которых содержат значение кодовой точки, которая является числом, идентифицирующим символ в наборе символов. По своему замыслу Unicode является надмножеством ASCII и использует те же кодовые точки для общих символов. Класс Character сообщает, является ли кодовая единица полной кодовой точкой или одной из пары полных кодовых точек. - person Tom Blodget; 31.08.2014
comment
Ладно; Я думаю, что понимаю ... поэтому я отмечу это как ответ, поскольку комментарий поясняет, почему приведенное выше является правильным для вопроса, который я задал. - person Petter Emil Anderssen; 31.08.2014
comment
Ооо... не знал. Изменю ответ, чтобы отразить это. - person Mshnik; 31.08.2014

Символы — это, по сути, числа. Компьютер преобразует char в целое число, используя набор символов (charset). Наборы символов — это таблицы, которые связывают указанный символ с указанным целым числом, поэтому ваш компьютер может преобразовать его в двоичный формат и сохранить в памяти. Позже, когда это необходимо, это число может быть преобразовано обратно в символ. Ваш компилятор использует Unicode (надмножество ASCII, спасибо Тому Блоджету), поэтому символ «2» на самом деле представляет собой десятичное целое число 50 (дополнительная информация: http://unicode-table.com/en/, обратите внимание, что таблица использует шестнадцатеричные числа, поэтому шестнадцатеричное число 32 соответствует десятичному числу 50). Поскольку сложение по умолчанию возвращает целое число, символ трансформируется и добавляется, но фактически никогда не преобразуется обратно в исходную форму.

Что касается того, почему он дает ошибку, это, вероятно, потому, что Java различается между типами, и ваш компилятор (или что-то еще, выдающее ошибку) более строгий. Не верьте мне на слово, вам, вероятно, следует посмотреть стандарт и вашу реализацию. Например, в C это добавление всегда будет успешным.

Надеюсь, это немного прояснит ситуацию.

person Luke    schedule 31.08.2014
comment
Компилятор не использует ASCII. См. мой комментарий к этому ответу. - person Tom Blodget; 31.08.2014
comment
Забыл об этом, спасибо (и я пишу выходные строки для приложений на своем родном языке, который использует несколько символов, отличных от ASCII). Исправил ответ. - person Luke; 31.08.2014