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


при добавлении 'a' + 'b' Он производит 195. Является ли выходной тип данных char или int?

8 61

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 и byteshort) способствовать int -- JLS 5.6.2.

вы можете узнать следующие выражения о 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

Unicode To Decimal Converter

пример

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 должно быть взаимозаменяемым с другим в любом контексте. Кто-нибудь знает способ разобраться в этом?