PHP var становится отрицательным - PullRequest
2 голосов
/ 17 февраля 2011

У меня есть этот код:

<?php
$integer = 33963677451;
$integer &= 0xFFFFFFFF;
echo $integer;
?>

Но, когда я его выполняю, вывод будет

-396060917

Та же функция в Python

if __name__ == '__main__':
    integer = 33963677451
    integer &= 0xFFFFFFFF
    print integer

Вывод:

3898906379

Кажется, PHP не может хранить большие переменные.Ребята, вы знаете, как получить тот же результат в PHP, что и в Python?

Спасибо!

Ответы [ 6 ]

4 голосов
/ 17 февраля 2011

Это значение слишком велико для целого числа, python динамически преобразует его в длинную переменную. INT_MAX определяет, насколько большим может быть ваше целое число, прежде чем оно переключится в двойное число. Если вы хотите манипулировать большими числами без причуд, используйте GMPLIB арифметическую библиотеку с множественной точностью.

1 голос
/ 17 февраля 2011

Ваш 33,963,677,451 выше того, что поддерживает 32-разрядное целое число со знаком (максимум 2 147 483 647). 64-битные версии PHP поддерживают более высокие значения.

0 голосов
/ 17 февраля 2011

Если вы хотите увидеть, что происходит, вот инструкция printf, показывающая различные типы.

$i1 = 33963677451;
$i2 = 0xFFFFFFFFFFF;
printf("%b (%d, %f) & \n%b (%d, %f)\n = \n%b (%d, %f)", 
        $i1, $i1, $i1, $i2, $i2, $i2, $i1&$i2, $i1&$i2, $i1&$i2);

PHP переводит целые числа больше 32 бит в число с плавающей точкой. Похоже, что вы не можете выполнить эту операцию на поплавках.

0 голосов
/ 17 февраля 2011
<?php
$integer = (float) 33963677451;
$integer &= 0xFFFFFFFFFFF;
echo $integer;

попробуйте убедиться, что $ integer имеет тип float.

, чтобы узнать больше: http://www.php.net/manual/de/language.types.integer.php#language.types.integer.overflow

0 голосов
/ 17 февраля 2011

Я не знаю, является ли это просто опечаткой, но вы используете разные значения при выполнении операции AND на каждом языке. :)

В вашей версии PHP "0xFFFFFFFFFFF" (11 символов), а в версии Python - только 8.

В любом случае, это должно быть целочисленное переполнение.

0 голосов
/ 17 февраля 2011

php поддерживает только целые числа со знаком. Вы видите переполнение

также, ответ для случая с питоном должен быть 33963677451

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...