Ответ 1
2147483648.0 на самом деле 2 31 тогда как максимальное значение для int
равно 2 31 -1. Таким образом, это значение с плавающей запятой буквально одно значение слишком высоко, чтобы соответствовать.
Причина, по которой он будет усекать его до наивысшего значения int, описана в спецификации языка как сужение преобразования.. p >
На первом шаге число с плавающей запятой преобразуется либо в long, если T long, либо в int, если T является байтом, коротким, char или int, следующим образом:
Если число с плавающей запятой NaN (п. 4.2.3), результатом первого шага преобразования является int или long 0.
В противном случае, если число с плавающей запятой не является бесконечностью, значение с плавающей запятой округляется до целочисленного значения V, округления к нулю с использованием режима IEEE 754 round-to-zero (§4.2.3). затем существует два случая:
Если T длинно, и это целочисленное значение может быть представлено как длинное, то результатом первого шага является длинное значение V.
В противном случае, если это целочисленное значение может быть представлено как int, то результатом первого шага является значение int V.
Соответствующая часть здесь состоит в том, что значение будет округлено к нулю. Пока значение (или длинное) с плавающей запятой превышает Integer.MAX_VALUE
, приведение к int
приведет к его наивысшему значению. То же самое верно для значения, которое меньше, чем Integer.MIN_VALUE
.
Что-то любопытное случается, если вы используете (int)-214783649L
; он вдруг станет 214783647! Почему это происходит, также объясняется в JLS, мой упор:
Сужение преобразования знакового целого числа в интегральный тип T просто отбрасывает все, кроме n младших битов порядка, где n - количество бит, используемых для представления типа T. В дополнение к возможному потеря информации о величине числового значения, , это может привести к тому, что знак результирующего значения будет отличаться от знака входного значения.
Длительное представление этого значения в двоичном формате с каналом, обозначающим 32-битное прерывание, выглядит следующим образом:
1111 1111 1111 1111 1111 1111 1111 1111 | 0111 1111 1111 1111 1111 1111 1111 1111
Когда происходит преобразование, первые 32 бита отбрасываются, оставляя вас с максимально возможным int
.
Обратное истинно с положительным длинным - более высокие 32 бита содержат все 1s, которые отбрасываются при преобразовании.
Полная структура приведена ниже, при этом труба снова обозначает 32-битную метку:
1111 1111 1111 1111 1111 1111 1111 1111 | 1000 0000 0000 0000 0000 0000 0000 0000