Специфика приведения к int, от двойного и длинного - PullRequest
0 голосов
/ 06 февраля 2019

Привет, поэтому недавно я увидел вопрос, структурированный так:

int a= (int) Math.pow(2,32);
System.out.println(a); //prints out Integer.MAX_VALUE

После того, как я ответил на вопрос, оказалось, что я ошибся, я ответил на Integer.MIN_VALUE, но правильный ответ был Integer.MAX_VALUE.После дальнейшего тестирования я понял, что любой double, который я приведу к int, больше чем Integer.MAX_VALUE, просто делает int равным Integer.MAX_VALUE.Например,

int a = (int) ((double) Integer.MAX_VALUE+100);
System.out.println(a); //prints out Integer.MAX_VALUE

После дальнейшего тестирования я понял, что если вы пытаетесь привести long к int, кажется, что int присваивается, казалось бы, случайному числу.

Итак, мой вопрос.Какого черта происходит, почему двойное значение не переполняет целое число, когда вы приводите его к типу int?и почему приведение long к int возвращает, казалось бы, случайное число

Ответы [ 2 ]

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

Логика этих преобразований является частью спецификации языка Java, Item 5.1.3 .

Здесь вы можете видеть, что при преобразовании из long в int старшие значащие битыотбрасывается, оставляя младшие 32 бита.

А также, что если результатом округления double или float является число, которое слишком мало или слишком велико, чтобы представлять его как int (или long), будет выбрано минимальное или максимальное представимое число.

Мы не можем здесь ответить «почему» за решение, которое было принято давно.Но именно так определяется язык, и вы можете положиться на то, что он будет одинаковым в любой среде Java, в которой вы работаете.

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

для приведения двойного значения к целому, это приведет к удалению значения точки после, а остаток подобен округлению до значения двойного значения, и для первого вопроса int вернет значение, которое может сохранить в 8 битах, чтобыкажется, min.value long a = Math.pow (2,32);даст вам max.value и для приведения long к целому числу Это не случайное число.Это самые правые 32 бита длинного числа, извините за плохое письмо, английский - мой второй язык

...