Почему я могу генерировать char за пределами максимального значения?

Почему следующий код не генерирует ошибку?

System.out.println((char) 2147483647);

Согласно oracle datatypes, максимальный размер для char составляет 65,535.

  • char: Тип данных char - это один 16-разрядный символ Юникода. Он имеет минимальное значение '\ u0000' (или 0) и максимальное значение '\ uffff' (или 65 535 включительно).

Ответы

Ответ 1

Почему я могу генерировать char за пределами максимального значения?

2147483647 не является char, но int.

Вы не назначаете недопустимое значение char, вы применяете действительный int to char, а затем применяете сужение правил примитивного преобразования. См. Спецификации Java: §5.1.3.

Короче говоря, вы сохраняете самые младшие 16 бит исходного целого числа ( "Сужение преобразования целого числа со знаком в интегральный тип T просто отбрасывает все, кроме n бит младшего разряда, где n - количество бит, используемых для представления типа T." ).

Почему следующий код не генерирует ошибку?

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

Ответ 2

Вы выполняете сужающееся преобразование от int до char, которое разрешено см. спецификацию java: 5.1.3. Сужение примитивного преобразования:

Сужение преобразования знакового целого числа в интегральный тип T просто отбрасывает все, кроме n бит младшего разряда, где n - количество бит, используемых для представления типа T. В дополнение к возможной потере информации о величине числового значения это может привести к тому, что знак результирующего значения будет отличаться от знака входного значения.

Результирующий char не больше Character.MAX_VALUE. Компилятор преобразует (char) 2147483647 в 65535

Ответ 3

char - это 16-битный тип данных, к которому может быть добавлено числовое значение.

Когда вы отбрасываете 32-битное целое число на короткий 16-разрядный (или на char), вы теряете верхние биты вашего источника.

Int32 i = 2147483647; // 0x7FFFFFFF
Int16 s = (Int16) i;  //     0xFFFF (65535)
char  c = (char)  i;  //     0xFFFF (65535)

Ответ 4

Это работает с любым типом данных, который называется integer overflow, и при отключении любого бита, превышающего размер используемого вами типа.

Ответ 5

Собственно, ответ на ваш вопрос вы не можете.

Почему вы не видите ошибки?
Поскольку Character.MAX_VALUE + 1 = Character.MIN_VALUE... То же, что и Integer.MAX_VALUE и другие, JVM рассматривает его как цикл, чтобы избежать таких проблем... , но дает ложные результаты при попытке вычисления....

Проверьте этот вопрос для дальнейшей и технической информации