Вопрос-ответ

In Java, is the result of the addition of two chars an int or a char?

В Java результат добавления двух символов является int или a char?

При добавлении 'a' + 'b' получается 195. Это тип выходных данных char или int?

Переведено автоматически
Ответ 1

Результатом добавления символов Java, коротких символов или байтов является int:

Спецификация языка Java для продвижения двоичных чисел:



  • Если какой-либо из операндов имеет ссылочный тип, выполняется преобразование unboxing (§5.1.8). Затем:

  • Если один из операндов имеет тип double , другой преобразуется в double .

  • В противном случае, если один из операндов имеет тип float , другой преобразуется в 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 (для целых чисел), 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')

Ответ 2

Двоичные арифметические операции над char и byteshort) продвигаются к int -- JLS 5.6.2.

Ответ 3

Возможно, вы захотите изучить следующие выражения о 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, и переменная строкового типа temp автоматически принимает c тип char и создает temp=A на консоли.


Все следующие инструкции также действительны в Java!

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 Расширяющее преобразование примитивов".

Ответ 4

Компилятор Java может интерпретировать его как любой из них.

Проверьте это, написав программу и поискав ошибки компилятора:

public static void main(String[] args) {
int result1 = 'a' + 'b';
char result2 = 'a' + 'b';
}

Если это char , то первая строка выдаст ошибку, а вторая - нет.
Если это int , то произойдет обратное.

Я скомпилировал его и получил..... ОШИБОК НЕТ. Таким образом, Java принимает оба.

Однако, когда я распечатал их, я получил:


int: 195


char:


Что происходит, когда вы делаете:

char result2 = 'a' + 'b'

выполняется неявное преобразование ("примитивное сужающее преобразование" из int в char).

java