При попытке привести double x
к типу short
double x = 389889877779.89;
System.out.println((short)x);
на консоль выводится -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
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Изучаю структуры данных и пытаюсь создать бинарное дерево поиска с дженериками и пройтись по нему в глубину in orderКогда вызываю метод inOrder...
недавно начал изучать javaЗадание: сделать игру, в которой пользователю нужно угадать цифру от 0 до 100 + в конце сделать счетчик попыток
На макете видно эллипс слева и прямоугольник справаТак вот вопрос: как задать два бэкграунда через CSS, чтобы всё хорошо работало?