Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Ошибка в скрипте на сервере


Автор: Levsha 8.6.2007, 01:49
Здравствуйте. Есть такой вот элементарный код:
Код

<?php
$a = -4738698913 ;
$a = $a ^ 43814;
echo $a;
?>

Локально все высчитывается правильно, возвращается число -443704711.
Но сервер упорно возвращает -2147439834.
Почему сервер может считать неправильно? И там и там PHP5. Вроде операция относится к стандартным логическим, и отдельной библиотеки для нее не нужно, хотя я с трудом понимаю, что делает эта операция.

Автор: vasac 8.6.2007, 10:53
Потому что на сервере может быть одна архитектура, а на локалке другая.
Потому что сервер может хранить целые числа в одном размере, а локалка в другом (ваше число даже в 32-битные не входит)
Потому что сервер может хранить отрицательные числа одним образом, а локалка другим.

Автор: Levsha 8.6.2007, 14:20
Цитата

Потому что сервер может хранить отрицательные числа одним образом, а локалка другим.


Вот-вот. Там какие-то проблемы с отрицательными числами, опытным путем установил.
Как мне это обойти? 
Какое именно действие выполняется в $a = $b ^ $c ?
Может у кого есть заменяющая функция?

Автор: WolfON 8.6.2007, 14:25
http://ru2.php.net/integer
Обновите версию интерпретатора.

Ну или если все совсем плохо, то:
http://ru2.php.net/manual/ru/ref.bc.php
и
http://ru2.php.net/manual/ru/ref.gmp.php

Автор: vasac 8.6.2007, 15:28
Цитата(Levsha @  8.6.2007,  14:20 Найти цитируемый пост)
Какое именно действие выполняется в $a = $b ^ $c ?

Зачем вы выполняете действие, которое не знаете?

Автор: Levsha 8.6.2007, 16:08
vasac, это действие используется в генерации ключа, скрипт чужой.
Но мне нужно сгенерировать тот-же ключ. Локально получилось, получается проблема только в сервере. Вот и тужусь.
Цитата(WolfON @  8.6.2007,  14:25 Найти цитируемый пост)
Обновите версию интерпретатора.

Каким образом? В смысле весь PHP обновить? Он и так пятый.
За ссылки спасибо, изучаю

Автор: Levsha 8.6.2007, 19:59
Кто нибудь знает что именно выполняет оператор ^ ?

Поигрался с двоичными значениями, наткнулся на следующее, стандартные операторы преобразования в двоичное и обратно врут с отрицательными значениями:
Код

echo "<br>".bindec(decbin(-443704711)); //вернет 3851262585
echo "<br>".base_convert(base_convert(-443704711, 10, 2), 2, 10); //вернет 443704711, т.е. теряем минус


Кто нибудь знает точное правило преобразования отрицательного числа в двоичное?

Добавлено через 49 секунд
В смысле сам алгоритм? Мож кто выполнял этот алгоритм?

Автор: vasac 8.6.2007, 20:05
Он выполняет ровно то, что написано в документации — побитовое исключающее ИЛИ.
Отрицательные обычно хранятся в дополнительном коде — инвертируются все биты и прибавляется единица. Как можно понять, результат при этом будет сильно зависеть от количества битов в числе.
Конвертация десятичных в двоичные не даст представления о том, как числа хранятся в памяти.

Автор: sTa1kEr 8.6.2007, 21:35
Цитата(Levsha @  8.6.2007,  01:49 Найти цитируемый пост)
Почему сервер может считать неправильно? 

Цитата

Размер целого зависит от платформы, хотя, как правило, максимальное значение около двух миллиардов (это 32-битное знаковое).

Цитата

Если вы определите число, превышающее пределы целого типа, оно будет интерпретировано как число с плавающей точкой. Также, если вы используете оператор, результатом работы которого будет число, превышающее пределы целого, вместо него будет возвращено число с плавающей точкой.

Но так как,
Цитата

Побитовые операторы позволяют устанавливать конкретные биты в 0 или 1 для целочисленных значений.

То работать на 32-х битной архитектуре это не будет. И обновление PHP здесь, к сожалению, никак не поможет. А вот GMP Functions (см. ссылку WolfON) тут как раз подойдут.
Код

$a = gmp_xor(gmp_init("-4738698913", 10), gmp_init("43814", 10));
echo gmp_strval($a);

Автор: Levsha 10.6.2007, 09:50
Разобрал функцию по кусочкам, полностью вручную переписал её действие но все равно не подошло.

sTa1kEr, так ведь на чужом хостинге сижу. Они новый модуль ставить не будут. Менять надо на фиг хостеров. 

В общем скоро новую тему создам, сюда отпишусь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)