@synapse_people

Почему LONG странно себя ведет?

в JAVA SE 8
0xCCD044A12FDB3E13l
равен
-3688372635733115373
а в PHP происходит каст в double
double(1.4758371437976E+19)
Почему, если ранги значений одинаковые....... и как этого можно избежать?
  • Вопрос задан
  • 213 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Рассматриваем 64 битное число, big endian byte order в hex представлении записанном как CCD044A12FDB3E13
В linux php x64 реализует целочисленный int как 64 битовое знаковое число независимо от версии интерпретатора - соответственно подходит.

Согласно синтаксису PHP шестнадцатеричная запись числа является беззнаковой, знак указывается явно. Число CC больше 7F - следовательно, в знаковом типе недостаточно разрядов (в int есть 63 разряда + бит знака, а требуется минимум 64 + знак) и число приводится к float
Если вы возьмёте 0x7cd044a12fdb3e13 - это число укладывается в 63 разряда + знак и будет помещено в int тип данных.

Если у вас машинное представление числа и его необходимо корректно разобрать - есть unpack:
var_dump(unpack('J', "\xCC\xD0\x44\xA1\x2F\xDB\x3E\x13")[1]);

Что даст искомый int(-3688372635733115373)
Плюс внимание на порядок байт. Что unpack позволяет учитывать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Потому что java строго типизированный язык и long на всех без исключения платформах имеет строго типизированную длину, причем до Java8 это еще и тип со знаком.
long: The long data type is a 64-bit two's complement integer. The signed long has a minimum value of -2**63 and a maximum value of 2**63-1. In Java SE 8 and later, you can use the long data type to represent an unsigned 64-bit long, which has a minimum value of 0 and a maximum value of 2**64-1. Use this data type when you need a range of values wider than those provided by int. The Long class also contains methods like compareUnsigned, divideUnsigned etc to support arithmetic operations for unsigned long.


Ну и например можно воспользоваться коллекциями guava - https://google.github.io/guava/releases/19.0/api/d...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы