Почему я могу генерировать 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
рассматривает его как цикл, чтобы избежать таких проблем... , но дает ложные результаты при попытке вычисления....
Проверьте этот вопрос для дальнейшей и технической информации