В 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: Ã
что происходит, когда вы делаете:
char result2 = 'a' + 'b'
выполняется неявное преобразование ("примитивное сужающее преобразование" из int to 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
значения и где значения Unicode представлены \u
следовал по Hexadecimal
значения.
как любая арифметическая операция на char
ценности для int
, так что результат 'a' + 'b'
рассчитывается как
1.) Применить Unicode
значения на соответствующий char
используя Unicode Table
2.) Применить шестнадцатиричной в Decimal преобразование, а затем выполнить операцию на 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 должно быть взаимозаменяемым с другим в любом контексте. Кто-нибудь знает, как это понять?