В Java, является ли результатом добавления двух символов int или char?
при добавлении 'a' + 'b' Он производит 195. Является ли выходной тип данных char или int?
8 ответов:
в результате добавления в Java символы, шорты, или байт-это int:
спецификация языка Java на двоичном числовом продвижении:
- если какой-либо из операндов имеет ссылочный тип, распаковка преобразования (§5.1.8) выполняется. Затем:
- если любой из операндов имеет тип double, то другое преобразуется в double.
- в противном случае, если один из операндов имеет тип поплавок, другой преобразуются в тип float.
- в противном случае, если один из операндов имеет тип long, другой преобразуется в long.
- в противном случае, оба операнда преобразуются в тип int.
но обратите внимание, что он говорит о составных операторах присваивания (например,+=):
результат двоичной операции преобразуется в тип левой переменной... и результат преобразования сохраняется в виде переменная.
например:
char x = 1, y = 2; x = x + y; // compile error: "possible loss of precision (found int, required char)" x = (char)(x + y); // explicit cast back to char; OK x += y; // compound operation-assignment; also OKодин из способов узнать тип результата, в общем случае, заключается в том, чтобы привести его к объекту и спросить его, какой это класс:
System.out.println(((Object)('a' + 'b')).getClass()); // outputs: class java.lang.Integerесли вы заинтересованы в производительности, отметим, что байт-код Java даже не имеет специальных инструкций для арифметики с меньшими типами данных. Например, для добавления есть инструкции
iadd(для ints),ladd(для лонгов),fadd(для поплавков),dadd(для двойников), и это все. Для имитацииx += yс меньшими типами компилятор будет использоватьiaddа затем обнулить верхние байты int с помощью инструкции, какi2c("int to char"). Если родной блок, посвященный инструкции для 1 байт или 2 байта данных, вплоть до виртуальной машины Java, чтобы оптимизировать для этого во время выполнения.если вы хотите объединить символы в строку, а не интерпретировать их как числовой тип, есть много способов сделать это. Проще всего добавить пустую строку в выражение, потому что добавление символа и строки приводит к строке. Все эти выражения приводят к строке
"ab":
'a' + "" + 'b'"" + 'a' + 'b'(это работает, потому что"" + 'a'оценивается первым; если""были в конце вместо этого вы получите"195")new String(new char[] { 'a', 'b' })new StringBuilder().append('a').append('b').toString()String.format("%c%c", 'a', 'b')
вы можете узнать следующие выражения о
char.char c='A'; int i=c+1; System.out.println("i = "+i);это совершенно справедливо в Java и возвращает
66, соответствующее значение символа (Unicode)c+1.
String temp=""; temp+=c; System.out.println("temp = "+temp);это слишком допустимо в Java и переменной типа String
tempавтоматически принимаетcтипа char и производитtemp=Aна консоли.
все следующие утверждения справедливы в Ява!
Integer intType=new Integer(c); System.out.println("intType = "+intType); Double doubleType=new Double(c); System.out.println("doubleType = "+doubleType); Float floatType=new Float(c); System.out.println("floatType = "+floatType); BigDecimal decimalType=new BigDecimal(c); System.out.println("decimalType = "+decimalType); Long longType=new Long(c); System.out.println("longType = "+longType);хотя
cтипchar, он может быть поставлен без ошибок в соответствующих конструкторах, и все вышеперечисленные операторы рассматриваются как допустимые операторы. Они производят следующие выходы соответственно.intType = 65 doubleType = 65.0 floatType = 65.0 decimalType = 65 longType =65
charявляется примитивным числовым целочисленным типом и как таковой подчиняется всем правилам этих зверей, включая конверсии и рекламные акции. Вы захотите прочитать об этом, и JLS является одним из лучших источники для этого:конверсии и промо-акции. В частности, прочитайте короткий бит на "5.1.2 расширение примитивного преобразования".
компилятор Java может интерпретировать его как один.
проверьте это, написав программу и ища ошибки компилятора:
public static void main(String[] args) { int result1 = 'a' + 'b'; char result2 = 'a' + 'b'; }Если это символ, то первая строка даст мне ошибку, а вторая-нет. Если это int, то произойдет обратное.
я скомпилировал его и получил..... НИКАКАЯ ОШИБКА. таким образом, Java принимает оба.
однако, когда я их напечатал, я получил:
int: 195
символ: *
что происходит, когда вы делаете:
char result2 = 'a' + 'b'выполняется неявное преобразование ("примитивное сужающее преобразование" из int до char).
по словам бинарные правила продвижения, Если ни один из операндов не является двойным, плавающим или длинным, оба они повышаются до int. Тем не менее, я настоятельно рекомендую не рассматривать тип char как числовой, такой вид поражает его цель.
хотя у вас уже есть правильный ответ (ссылка в JLS), вот немного кода, чтобы убедиться, что вы получаете
intпри добавлении двухchars.public class CharAdditionTest { public static void main(String args[]) { char a = 'a'; char b = 'b'; Object obj = a + b; System.out.println(obj.getClass().getName()); } }выход
java.ленг.Целое число
charпредставленUnicodeзначения и где значения Юникода представлены\uследовал поHexadecimalзначения.как любая арифметическая операция на
charценности дляint, так что результат'a' + 'b'рассчитывается как1.) Применить
Unicodeзначения на соответствующийcharиспользуяUnicode Table2.) Применить шестнадцатиричной в Десятичные преобразование и затем выполнить операцию на
Decimalзначения.char Unicode Decimal a 0061 97 b 0062 98 + 195пример
0061(0*163) + (0*162) + (6*161) + (1*160)
(0*4096) + (0*256) + (6*16) + (1*1)
0 + 0 + 96 + 1 = 97
0062(0*163) + (0*162) + (6*161) + (2*160)
(0*4096) + (0*256) + (6*16) + (2*1)
0 + 0 + 96 + 2 = 98
отсюда
97 + 98 = 195
Пример 2
char Unicode Decimal Ջ 054b 1355 À 00c0 192 -------- 1547 + 1163 - 7 / 260160 * 11 %
вот что-то странное, хотя. Следующие компиляции:
char x; x = 'a' + 'b';но это не:
char x; x = 'a'; x = x + 'b';похоже, что оба выражения ('a' + ' b 'и x+ 'b') приводят к целым числам с помощью следующего теста:
Object obj = 'a'+'b'; System.out.println(obj.getClass().getName()); char x = 'a'; Object obj2 = x+'b'; System.out.println(obj2.getClass().getName());так почему бы второй случай не компилировать? Кстати, вы можете исправить это, бросив все выражение как символ:
x = (char)(x+'b');это похоже на несогласованность в семантике Java-любое выражение char должно быть взаимозаменяемым с другим в любом контексте. Кто-нибудь знает способ разобраться в этом?