Подтвердить что ты не робот

Java: вычитаем '0' из char, чтобы получить int... почему это работает?

Это отлично работает:

int foo = bar.charAt(1) - '0';

Но это не так - потому что bar.charAt(x) возвращает char:

int foo = bar.charAt(1);

Кажется, что вычитание '0' из char отличает его к целому числу.

Почему, или как, вычитает строку '0' (или это char?) конвертирует другой char в целое число?

4b9b3361

Ответ 1

Это умный трюк. char имеют тот же тип/длину, что и шорты. Теперь, когда у вас есть char, который представляет цифру ASCII/unicode (например, "1" ), и вы вычитаете из него наименьшую цифру ASCII/Unicode (например, "0" ), тогда вы останетесь с цифрой соответствующее значение (следовательно, 1)

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

Ответ 2

Это старый трюк ASCII, который будет работать для любой кодировки, которая строит цифры от 0 'до' 9 'последовательно, начиная с' 0 '. В Ascii '0' - символ со значением 0x30 и '9' равен 0x39. В принципе, у вас есть символ, который является цифрой, вычитая "0", "преобразует" это значение в цифру.

Я должен не согласиться с @Lukas Eder и предположить, что это ужасный трюк; потому что цель этого действия сводится к 0% очевидному из кода. Если вы используете Java и имеете String, который содержит цифры, и вы хотите преобразовать этот String в int, я предлагаю вам использовать Integer.parseInt(yourString);.

Этот метод имеет положительный эффект на то, чтобы быть очевидным для будущего программиста по обслуживанию.

Ответ 3

Следующий код работает отлично!

int foo = bar.charAt(1);

Подобно ссылочным типам любой Java-примитив может быть назначен без приведения другого примитива типа, который считается подтипом. Правила подтипирования для примитивов приведены JLS раздел 4.10.1. char считается подтипом int, поэтому любой char может быть назначен int.

Ответ 4

'0' также является char. Оказывается, символы в Java имеют значение unicode (UTF-16). Когда вы используете оператор - с символами, Java выполняет операцию с целыми значениями.

Например, int x = '0' - 'A';// x = 16

Ответ 5

Ваш код может компилироваться без ошибок и запускаться без исключения исключения, но преобразование между char и int - это плохая практика. Во-первых, это делает код запутанным, что приводит к головной боли обслуживания в будущем. Во-вторых, умные "трюки" могут помешать компиляторам оптимизировать байтовый код. Один из лучших способов получить быстрый код - написать код немой (т.е. Не умный).

Ответ 6

Потому что в Java, если вы не указали индикатор типа с номером, тогда он принимает Integer. Что я подразумеваю под этим, если вы хотите установить значение Long, это должно быть 0L.

Выполняя численную операцию на двух разных численных значениях, результат становится больше. Следовательно, a char (который является числовым значением) минус целое число, приводит к целому числу.

Вы обнаружите, что это работает и

long val = bar.charAt(1) - 0L;

Ответ 7

char неявно преобразуются в int:

   public static void main(String [] args) throws Exception {
     String bar = "abc";
     int foo = bar.charAt(1) - '0';
     int foob = bar.charAt(1);
     System.err.println("foo = " + foo + "   foob = " + foob);
   }

вывод: foo = 50 foob = 98.

Возможно, вы положили два int foo ..., и это потому, что это не сработало?

Ответ 8

Ваш второй отрезанный должен работать нормально, хотя:

int foo = bar.charAt(1);

A char, так же как a short или byte, при необходимости будет автоматически прикладываться к int.

Это будет просто отлично: int i = 'c';