Примитивное приведение типа данных в Java - Внутренняя логика - PullRequest
1 голос
/ 18 марта 2011

Ребята, я хочу понять, как расширение или узкое неявное приведение внутренне реализовано в java. Я знаю, что это включает в себя битовую игру.

Например:

//implicit
int i =2400;
long a = (long)i; 

//Explicit  
 float d = (float) 2.23423;

Обновления:

Я написал это сообщение, посмотрев на вопрос, размещенный здесь Сдвиг чтения / записи данных . Питер Лоури дал следующий ответ.

public long create(int one, int two){
    return ((long) one << 32) | (two & 0xFFFFFFFFL);
}

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

пожалуйста, дайте мне знать ваши ценные комментарии.1019 *

Ответы [ 3 ]

3 голосов
/ 18 марта 2011

Java использует стандартные инструкции машинного кода IEEE 754 , поддерживаемые вашим процессором.Так как Java не реализует эту функциональность, используя что-то, что вы можете разбить дальше.

Для преобразования из двойного в плавающее.

  • знак сохраняется
  • показатель степени равенусеченный, однако, если число слишком большое, оно уходит в бесконечность, если в маленькое, оно уходит в ноль.
  • у обоих форматов подразумевается старший бит, равный 1, это не изменяется.
  • 23 верхних бита мантиссы сохраняются (с необязательным округлением 24-го бита)

Для двойного числа с плавающей запятой процесс аналогичен, за исключением того, что поля расширены.

Однако это всесделано в процессоре с плавающей запятой, и Java не играет никакой роли в том, как это происходит.

1 голос
/ 18 марта 2011

Взгляните на эту статью о сужении и расширении примитивных преобразований.

0 голосов
/ 18 марта 2011

Дабл имеет 64 бит, тогда как у поплавка 32 бит. Когда вы бросаете двойник в число с плавающей точкой, вы просто отбрасываете первые 32 бита.

Наоборот, когда вы расширяете, вы просто добавляете 0 битов, чтобы заполнить больший шрифт, например, вы добавляете 32 нуля впереди 32 битов целого, чтобы сделать длинный.

...