Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка в скрипте на сервере, Локально все работает правильно 
:(
    Опции темы
Levsha
  Дата 8.6.2007, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 30.9.2005

Репутация: нет
Всего: 4



Здравствуйте. Есть такой вот элементарный код:
Код

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

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



--------------------
PM   Вверх
vasac
Дата 8.6.2007, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 8
Всего: 36



Потому что на сервере может быть одна архитектура, а на локалке другая.
Потому что сервер может хранить целые числа в одном размере, а локалка в другом (ваше число даже в 32-битные не входит)
Потому что сервер может хранить отрицательные числа одним образом, а локалка другим.
PM WWW   Вверх
Levsha
Дата 8.6.2007, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 30.9.2005

Репутация: нет
Всего: 4



Цитата

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


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


--------------------
PM   Вверх
WolfON
Дата 8.6.2007, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: 6
Всего: 8



http://ru2.php.net/integer
Обновите версию интерпретатора.

Ну или если все совсем плохо, то:
http://ru2.php.net/manual/ru/ref.bc.php
и
http://ru2.php.net/manual/ru/ref.gmp.php
PM MAIL ICQ   Вверх
vasac
Дата 8.6.2007, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 8
Всего: 36



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

Зачем вы выполняете действие, которое не знаете?
PM WWW   Вверх
Levsha
Дата 8.6.2007, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 30.9.2005

Репутация: нет
Всего: 4



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

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



--------------------
PM   Вверх
Levsha
Дата 8.6.2007, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 30.9.2005

Репутация: нет
Всего: 4



Кто нибудь знает что именно выполняет оператор ^ ?

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

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


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

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


--------------------
PM   Вверх
vasac
Дата 8.6.2007, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 8
Всего: 36



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

Это сообщение отредактировал(а) vasac - 8.6.2007, 20:07
PM WWW   Вверх
sTa1kEr
Дата 8.6.2007, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Цитата(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);

PM MAIL   Вверх
Levsha
Дата 10.6.2007, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 30.9.2005

Репутация: нет
Всего: 4



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

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

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


--------------------
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1156 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.