Преобразование символов в Ints в Java

Система: Windows Vista 32-бит, Java 6.0.2

У меня есть несколько вопросов о преобразовании символов в целые числа. Я запускаю приведенный ниже код, оставляя myInt со значением 4:

  char myChar = '4';
  int myInt = myChar - '0';

Итак, является ли это преобразование чем-то, что Java выполняет автоматически? Было ли значение ascii «0» вычтено из ascii «4», а затем преобразовано в int за кулисами? Это сбивает меня с толку, потому что, когда я пытаюсь выполнить обратную операцию, мне приходится фактически приводить результат в виде символа:

  int anotherInt = 5;
  char newChar = anotherInt + '0'; //gives error

  char newChar = (char)(anotherInt + '0'); //works fine

Это происходит потому, что Java автоматически преобразует (anotherInt + '0') в int, как в первом примере? Спасибо.


person worker1138    schedule 19.11.2010    source источник
comment
Попробуйте это с int s и long s и посмотрите, что произойдет. int myInt = 1L   -  person Jonathon Faust    schedule 19.11.2010


Ответы (2)


Преобразование из char (2-байтовый тип) в int (4-байтовый тип) неявно в Java, потому что это расширяющееся преобразование - все возможные значения, которые вы можете сохранить в char, вы также можете сохранить в int. Обратное преобразование не является неявным, потому что это сужающее преобразование - оно может потерять информацию (два верхних байта int отбрасываются). В таких сценариях всегда необходимо явное приведение типов, чтобы сообщить компилятору: «Да, я знаю, что это может привести к потере информации, но я все равно хочу это сделать».

person cdhowie    schedule 19.11.2010
comment
Спасибо, в этом есть смысл. - person worker1138; 20.11.2010

Если правила C - это что-то, что нужно, ваш char может быть автоматически преобразован в int без преобразования в вашем первом примере, поскольку преобразование не влечет за собой потерю информации.

Однако во втором случае требуется явное приведение, когда есть вероятность потери информации, поскольку char меньше, чем int.

person Nathan Pitman    schedule 19.11.2010
comment
Вам не следует пытаться вывести правила ввода Java из C. Если вы не знаете Java, вам лучше не пытаться отвечать на вопросы Java, IMO. - person Stephen C; 19.11.2010
comment
Я действительно знаю Java, я просто более определен в правилах ввода C. Основываясь на моем опыте работы с Java, на том факте, что Java в значительной степени основан на C, и на основании моих наблюдений, что Java не противоречит правилам C, которые я знаю, Я разместил свой ответ. - person Nathan Pitman; 19.11.2010