хочу сюди!
 

Людмила

48 років, рак, познайомиться з хлопцем у віці 45-55 років

Неприятные последствия при переходе с 32-х битной на 64-х битную

  • 21.02.12, 08:47
  • php
При переходе с 32-х битной на 64-х битную версию PHP выплывает очень неприятный сюрприз - все функции, которые возвращали отрицательное целое число (crc32, ip2long, etc), при тех же данных, будут возвращать положительное число.

Результат работы следующего кода:
<?php
echo crc32('habrahabr test crc32');
?>

На 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 = crc32($num);
if($crc & 0x80000000) 
$crc -= 2<<31;

2) При выводе использовать свой шаблон: (s)printf("%d", $crc) или (s)printf("%u", $crc).
3) Использовать 32-х битную версию PHP.
3

Коментарі

Гість: Re@der! c@m

121.02.12, 08:54

непонятно-на одном и том же компе сначала была 32 бит ОС,
сейчас 64-всё ОК,ни каких проблем.

    221.02.12, 09:00Відповідь на 1 від Гість: Re@der! c@m

    Проблема связана именно с особенностями PHP

      321.02.12, 09:01

      Ты думаешь тут многие поймут о чем вообще речь? + за волю к победе

        анонім

        421.02.12, 09:24Відповідь на 3 від gav5713

        Ты думаешь тут многие поймут о чем вообще речь? + за волю к победея , лично, не понял

          Гість: Re@der! c@m

          521.02.12, 09:30Відповідь на 4 від анонім

          Ты думаешь тут многие поймут о чем вообще речь? + за волю к победея , лично, не понялвсё очень просто-прочитай статью и поймёшь(я,правда,не понял)

            621.02.12, 09:32Відповідь на 4 від анонім

            Ты думаешь тут многие поймут о чем вообще речь? + за волю к победея , лично, не понялЗначит - нормальный. Среди пишущих програмеров много людей странных.
            Сам был таким.
            Спассся посредством пьянства!

              анонім

              721.02.12, 09:34Відповідь на 5 від Гість: Re@der! c@m

              Ты думаешь тут многие поймут о чем вообще речь? + за волю к победея , лично, не понялвсё очень просто-прочитай статью и поймёшь(я,правда,не понял)вот если мне автор рассказал полное ТТХ нового образца АК для МП, или кумулятивного выстрела образца 2010 -го года, я бы понял

                анонім

                821.02.12, 09:34Відповідь на 6 від gav5713

                Ты думаешь тут многие поймут о чем вообще речь? + за волю к победея , лично, не понялЗначит - нормальный. Среди пишущих програмеров много людей странных.
                Сам был таким.
                Спассся посредством пьянства!
                зло выгнал злом

                  921.02.12, 09:51Відповідь на 1 від Гість: Re@der! c@m

                  непонятно-на одном и том же компе сначала была 32 бит ОС,
                  сейчас 64-всё ОК,ни каких проблем.
                  это относится к программной среде Php (язык программирования) мол на процах с интрукциями 64х выходит лажа в ихнем космосе)))

                    1021.02.12, 09:55Відповідь на 3 від gav5713

                    Ты думаешь тут многие поймут о чем вообще речь? + за волю к победену, кому нужно - поймут