В 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
при добавлении двухchar
s.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 Table
2.) Применить шестнадцатиричной в Десятичные преобразование и затем выполнить операцию на
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 должно быть взаимозаменяемым с другим в любом контексте. Кто-нибудь знает способ разобраться в этом?