2015-12-28 2 views
1

В соответствии с моим пониманием Casts используются для преобразования значения из одного типа в другой. Эта программа использует три последовательности подряд.Несколько слепок не работают по назначению

public class Multicast { 
public static void main(String[] args) { 
System.out.println((int) (char) (byte) -1); 
    } 
} 

Я думал, что он напечатает -1, но это печатает. Он печатает 65535, но почему?

+1

уже ответили подробно http://stackoverflow.com/questions/24635977/why-does-intcharbyte-2-produce-65534-in-java – Ramanlfc

ответ

1

Символ в java - это неподписанное 16-битовое целое число. Если вы производите отрицательный целочисленный литерал как -1 для символа, тогда значение интерпретируется как положительное число; в этом случае символ 65535- или Unicode \ uFFBF.

Проверить это -1 залито только полукоксом,

System.out.println((char) -1); 

Если залито int или byte типа, это возвращает -1 только.

2

Выражение: (int) (char) (byte) -1

  1. -1 имеет тип Int
  2. (byte) -1 является байт со значением -1
  3. (char) (byte) -1 первого байта со значением -1 знак продлен еще раз, чтобы быть 32-битовое целое значение -1. Это означает, что все 32-битные установлены в 1 (кодировка с двумя дополнениями -1 в 32 битах). Затем он преобразуется в тип char, который представляет собой неподписанное 16-битное значение, поэтому вы получаете 16 бит, равное единице, которое имеет значение 65535.
  4. (int) (char) (byte) -1, явно переведя его на 32-разрядное целое, вы делаете убедитесь, что оно напечатано как число вместо символа с кодовым номером 65535.
0

Отбрасывание с байта на символ сложнее, потому что байт является подписанным типом и charunsigned. Обычно можно преобразовать из одного интегрального типа в более широкий, сохранив числовое значение, но невозможно, чтобы представляло отрицательное байтовое значение как символ. Следовательно, преобразование из байта в charis не рассматривается как расширение примитивного преобразования [JLS 5.1.2], а расширение и сужение примитивного преобразования [JLS 5.1.4]: байт преобразуется в int и int в char.

Расширение знака выполняется, если тип исходного значения подписан; нулевое расширение, если оно является символом char, независимо от типа, к которому он относится .

Поскольку байт является подписанным типом, расширение знака возникает при преобразовании байтового значения -1 в символ. Полученный charvalue имеет все 16 бит, поэтому он равен 2 приращениям к мощности 16-1 или 65535. Листинг из charto int также является расширением примитива , поэтому правило говорит нам, что выполняется расширение нуля, а не расширение знака.

В результате значение int составляет 65535, что и печатается программой.

Смежные вопросы