За последние 24 часа нас посетили 58385 программистов и 1780 роботов. Сейчас ищут 780 программистов ...

int64 problem

Тема в разделе "Прочие вопросы по PHP", создана пользователем engager, 17 май 2011.

  1. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    есть код, который, как оказалось, расчитан на 32-х разрядную систему. в нем производится куча битовых операций (сдвиги, коньюкции, дизъюнкции, ксоры в общем пипец), в 32-битрой среде в иногда случается переполнение, в резултате получаем отрицательное число, а в 64-битной - положительное. ну например

    echo(0xffffffff << 1);

    32bit environment result : -2
    64bit environment result: 8589934590

    вопрос: как бы это разрулить? все осложняется тем, что код весьма громоздкий.
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Единственный вариант - все операции типа таких привести в пределы 32 бит. Вручную.
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Т.е. если вычисления происходят по описанным в скрипте алгоритмам, а не по системным, то ничего другого сделать нельзя
     
  4. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    как это сделать? что-то никакой инфы не могу найти по этому поводу.
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    engager
    Ну во-первых получается, что код расчитан на 64-битную систему, а не 32.
    Далее, в PHP INT в таких операциях всегда SIGNED, это означает, что самое большое число, которое в него может быть записано - (2^32)/2-1 = 2147483647
    Вывод: переписать код так, чтобы в нем не использовались числа больше 2147483647.
    Или проапгрейдить железо :)
     
  6. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    так как раз ситуация то обратная. система 64-битная, на нее переношу код, написанный под 32-битную систему.
     
  7. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    integer - generic type, его разрядность зависит от ОС и компилятора, фундаментальные типы есть? типа dword
     
  8. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    что говорит echo PHP_INT_MAX;
     
  9. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    С PHP тут все нормально - если 64бит система и пхп скомпилен под 64бит - использует 64 бит int, несмотря на то, что это принесло кучу багофич =)
     
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    не понял
    т.е. тебе надо, чтобы происходило переполнение и вылазило отрицательное число?
     
  11. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
  12. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    А, тогда собирай 32-х битный php.
    CFLAGS=”-m32″ CXXFLAGS=”-m32″ ./configure ...
    CFLAGS=”-m32″ CXXFLAGS=”-m32″ make
    CFLAGS=”-m32″ CXXFLAGS=”-m32″ make install
    Ну и если как mod_php, то, пожалуй, апач тоже нужно 32бит собрать.
     
  13. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    не, фиговый вариант, х64support тоже не плохо бы иметь в наличие. должно же быть какое-нибудь элегантное решение)
    мож что типа ini_set
     
  14. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Можно попробовать скомпилировать php на 32 разрядной системе...
     
  15. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Разрулить путем написания нормального кода. Когда пишется код, который с одной стороны _бездумно_ использует средства php, а с другой - использует низкоуровневые операции - рано или поздно все ломается.
    Например, вы в курсе, что приведенный вами 0xffffffff на 32-битной системе - это float? И при битовых операциях с ним он приводится в int? А на каком основании занимаясь таким тонким делом, как битовая логика было позволено какое-то приведение типов?
    Так что собирайте 32бит или переписывайте код. Теоретически можно всякими ифами эмулировать 32бит, но это самый кривой вариант.
     
  16. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    код не мой. это алгоритм вычисления некого хэша.
    если бы пхп был хотя бы мало-мальски типизированым, или имел аналог процессорного регистра - проблемы бы не было.
     
  17. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    В php есть типы данных. А дальше уж все за программистом.
    Скорее всего вы ничего не потеряете, если в системе у вас будет 32-битный php, ну или соберите оба.
     
  18. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Код большой? Закиньте - псмотрим.
     
  19. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    PHP:
    1. <?php
    2.         $crc = 0;
    3.         for ($i = strlen($message) - 1; $i >= 0; $i--) {
    4.             $crc += ord($message[$i]);
    5.             $crc &= 0xff;
    6.         }
    7.         $crc = ~$crc & 0xff;
    8.