Java char подписан или не подписан для арифметики? - PullRequest
0 голосов
/ 28 февраля 2019

Java char - это 16-битный тип данных, но подписан или не подписан, когда речь идет о выполнении арифметики?

Можно ли использовать его как 16-битное целое число без знака в арифметике?

Например, верно ли следующее?

char c1;
char c2;

int i = c1 << 16 | c2;

Или необходимо сначала удалить биты с расширенным знаком с c2?

(я уверен, что ответ на этот вопросгде-то в другом месте, но, кажется, его не обнаруживают очевидные поиски).

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

char без знака.От JLS§4.2.1 :

Для символа, от '\ u0000' до '\ uffff' включительно, то есть от 0 до 65535

... но учтите, что когда вы используете любую из различных математических операций над ними (включая побитовые операции и операции сдвига), они расширяются до другого типа в зависимости от типа другого операндаи этот другой тип вполне может быть подписан:

Расширяющее примитивное преобразование ( §5.1.2 ) применяется для преобразования одного или обоих операндов, как указано в следующих правилах:

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

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

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

  • В противном случае оба операндапреобразован в тип int.

Например, char + char равен int, поэтому:

public class Example {
    public static void main(String[] args) {
        char a = 1;
        char b = 2;

        char c = a + b;          // error: incompatible types: possible lossy conversion from int to char
        System.out.println(c);
    }
}

Повторно-битовое расширение, если мы следуем по ссылке выше на расширяющееся примитивное преобразование:

Расширяющее преобразование char в целочисленный тип T с нулем расширяет представлениезначение char для заполнения более широкого формата.

Так что char 0xFFFF становится int 0x0000FFFF, а не 0xFFFFFFFF.

0 голосов
/ 28 февраля 2019

От спецификации

Для char, от '\u0000' до '\uffff' включительно, то есть от 0 до 65535

Поскольку это 16 битов, это означает, что они не подписаны.

...