есть код, который, как оказалось, расчитан на 32-х разрядную систему. в нем производится куча битовых операций (сдвиги, коньюкции, дизъюнкции, ксоры в общем пипец), в 32-битрой среде в иногда случается переполнение, в резултате получаем отрицательное число, а в 64-битной - положительное. ну например echo(0xffffffff << 1); 32bit environment result : -2 64bit environment result: 8589934590 вопрос: как бы это разрулить? все осложняется тем, что код весьма громоздкий.
Т.е. если вычисления происходят по описанным в скрипте алгоритмам, а не по системным, то ничего другого сделать нельзя
engager Ну во-первых получается, что код расчитан на 64-битную систему, а не 32. Далее, в PHP INT в таких операциях всегда SIGNED, это означает, что самое большое число, которое в него может быть записано - (2^32)/2-1 = 2147483647 Вывод: переписать код так, чтобы в нем не использовались числа больше 2147483647. Или проапгрейдить железо
так как раз ситуация то обратная. система 64-битная, на нее переношу код, написанный под 32-битную систему.
integer - generic type, его разрядность зависит от ОС и компилятора, фундаментальные типы есть? типа dword
С PHP тут все нормально - если 64бит система и пхп скомпилен под 64бит - использует 64 бит int, несмотря на то, что это принесло кучу багофич =)
А, тогда собирай 32-х битный php. CFLAGS=”-m32″ CXXFLAGS=”-m32″ ./configure ... CFLAGS=”-m32″ CXXFLAGS=”-m32″ make CFLAGS=”-m32″ CXXFLAGS=”-m32″ make install Ну и если как mod_php, то, пожалуй, апач тоже нужно 32бит собрать.
не, фиговый вариант, х64support тоже не плохо бы иметь в наличие. должно же быть какое-нибудь элегантное решение) мож что типа ini_set
Разрулить путем написания нормального кода. Когда пишется код, который с одной стороны _бездумно_ использует средства php, а с другой - использует низкоуровневые операции - рано или поздно все ломается. Например, вы в курсе, что приведенный вами 0xffffffff на 32-битной системе - это float? И при битовых операциях с ним он приводится в int? А на каком основании занимаясь таким тонким делом, как битовая логика было позволено какое-то приведение типов? Так что собирайте 32бит или переписывайте код. Теоретически можно всякими ифами эмулировать 32бит, но это самый кривой вариант.
код не мой. это алгоритм вычисления некого хэша. если бы пхп был хотя бы мало-мальски типизированым, или имел аналог процессорного регистра - проблемы бы не было.
В php есть типы данных. А дальше уж все за программистом. Скорее всего вы ничего не потеряете, если в системе у вас будет 32-битный php, ну или соберите оба.
PHP: <?php $crc = 0; for ($i = strlen($message) - 1; $i >= 0; $i--) { $crc += ord($message[$i]); $crc &= 0xff; } $crc = ~$crc & 0xff;