Java: вычитаем '0' из char, чтобы получить int... почему это работает?
Это отлично работает:
int foo = bar.charAt(1) - '0';
Но это не так - потому что bar.charAt(x) возвращает char:
int foo = bar.charAt(1);
Кажется, что вычитание '0' из char отличает его к целому числу.
Почему, или как, вычитает строку '0' (или это char?) конвертирует другой char в целое число?
Ответы
Ответ 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';