Приведение double к short в Java

193
16 июня 2022, 02:50

При попытке привести double x к типу short

double x = 389889877779.89;
System.out.println((short)x);

на консоль выводится -1. Как это происходит на уровне битов? Неплохо было бы это визуализировать.

Answer 1

Явные преобразования

Потеря данных при преобразовании

При применении явных преобразований мы можем столкнуться с потерей данных. Например, в следующем коде у нас не возникнет никаких проблем:

int a = 5;
byte b = (byte) a;
System.out.println(b);      // 5

Число 5 вполне укладывается в диапазон значений типа byte, поэтому после преобразования переменная b будет равна 5. Но что будет в следующем случае:

int a = 258;
byte b = (byte) a;
System.out.println(b);      // 2

Результатом будет число 2. В данном случае число 258 вне диапазона для типа byte (от -128 до 127), поэтому произойдет усечение значения. Почему результатом будет именно число 2?

Число a, которое равно 258, в двоичном системе будет равно 00000000 00000000 00000001 00000010. Значения типа byte занимают в памяти только 8 бит. Поэтому двоичное представление числа int усекается до 8 правых разрядов, то есть 00000010, что в десятичной системе дает число 2.

Усечение рациональных чисел до целых

При преобразовании значений с плавающей точкой к целочисленным значениям, происходит усечение дробной части:

double a = 56.9898;
int b = (int)a;

Здесь значение числа b будет равно 56, несмотря на то, что число 57 было бы ближе к 56.9898. Чтобы избежать подобных казусов, надо применять функцию округления, которая есть в математической библиотеке Java:

double a = 56.9898;
int b = (int)Math.round(a);

Так вот в вашем случае происходит следующее. Преобразование в целое и потеря данных.

Примеры для тестов

double d = 389889877779.89;
System.out.println(Long.toBinaryString((long) d));//           101101011000111001111110110011100010011
System.out.println(Integer.toBinaryString((int) (long) d));//         11000111001111110110011100010011
System.out.println(Integer.toBinaryString((int) d));//                 1111111111111111111111111111111
System.out.println(Integer.toBinaryString((short) (long) d));//                        110011100010011
System.out.println(Integer.toBinaryString((short) d));//              11111111111111111111111111111111
READ ALSO
Обход и добавление в БДП

Обход и добавление в БДП

Изучаю структуры данных и пытаюсь создать бинарное дерево поиска с дженериками и пройтись по нему в глубину in orderКогда вызываю метод inOrder...

181
JAVA. счетчик попыток

JAVA. счетчик попыток

недавно начал изучать javaЗадание: сделать игру, в которой пользователю нужно угадать цифру от 0 до 100 + в конце сделать счетчик попыток

198
Проблема с рукописным текстом CSS

Проблема с рукописным текстом CSS

При комбинации свойств для текста:

346
Как задать разные фоны с помощью CSS?

Как задать разные фоны с помощью CSS?

На макете видно эллипс слева и прямоугольник справаТак вот вопрос: как задать два бэкграунда через CSS, чтобы всё хорошо работало?

390