Неприятные последствия при переходе с 32-х битной на 64-х битную
- 21.02.12, 08:47
При переходе с 32-х битной на 64-х битную версию PHP выплывает очень неприятный сюрприз - все функции, которые возвращали отрицательное целое число (crc32, ip2long, etc), при тех же данных, будут возвращать положительное число.
Результат работы следующего кода:
?>
На 32х битах = -982057838, на 64х битах = 3312909458, фактически это одно и тоже число - 0хc576fc92, разница только в интерпретации знакового бита. Если это число дальше используется, например для вставки в Mysql (в поле типа signed int), то вместо ожидаемых 2х одинаковых записей мы получим: -982057838 и 2147483647.
Данная особенность связана с тем, что в PHP внутренним представлением целого числа является long, который соответственно на 32х битных системах является 4х байтовым, а на 64х битных 8-ми байтовым. Проблема выплывает из-за того что при выводе данных php использует шаблон вывода "%ld", а знаковым считается 32-й или 64-й бит в зависимости от битности сборки PHP.
Пути решения проблемы:
1) Выставить знаковый бит:
$crc -= 2<<31;
2) При выводе использовать свой шаблон: (s)printf("%d", $crc) или (s)printf("%u", $crc).
3) Использовать 32-х битную версию PHP.
Результат работы следующего кода:
<?php
echo crc32('habrahabr test crc32');?>
Данная особенность связана с тем, что в PHP внутренним представлением целого числа является long, который соответственно на 32х битных системах является 4х байтовым, а на 64х битных 8-ми байтовым. Проблема выплывает из-за того что при выводе данных php использует шаблон вывода "%ld", а знаковым считается 32-й или 64-й бит в зависимости от битности сборки PHP.
Пути решения проблемы:
1) Выставить знаковый бит:
$crc = crc32($num);
if($crc & 0x80000000) $crc -= 2<<31;
3) Использовать 32-х битную версию PHP.
3
Коментарі
Гість: Re@der! c@m
121.02.12, 08:54
непонятно-на одном и том же компе сначала была 32 бит ОС,
сейчас 64-всё ОК,ни каких проблем.
Draal
221.02.12, 09:00Відповідь на 1 від Гість: Re@der! c@m
Проблема связана именно с особенностями PHP
gav5713
321.02.12, 09:01
Ты думаешь тут многие поймут о чем вообще речь? + за волю к победе
анонім
421.02.12, 09:24Відповідь на 3 від gav5713
я , лично, не понял
Гість: Re@der! c@m
521.02.12, 09:30Відповідь на 4 від анонім
всё очень просто-прочитай статью и поймёшь(я,правда,не понял)
gav5713
621.02.12, 09:32Відповідь на 4 від анонім
Значит - нормальный. Среди пишущих програмеров много людей странных.Сам был таким.
Спассся посредством пьянства!
анонім
721.02.12, 09:34Відповідь на 5 від Гість: Re@der! c@m
вот если мне автор рассказал полное ТТХ нового образца АК для МП, или кумулятивного выстрела образца 2010 -го года, я бы понял
анонім
821.02.12, 09:34Відповідь на 6 від gav5713
зло выгнал злом
Max_TAG
921.02.12, 09:51Відповідь на 1 від Гість: Re@der! c@m
это относится к программной среде Php (язык программирования) мол на процах с интрукциями 64х выходит лажа в ихнем космосе)))
Geen
1021.02.12, 09:55Відповідь на 3 від gav5713
ну, кому нужно - поймут