Маленький сюрприз при переходе на 64x

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Давайте-ка не будем идти по третьему кругу и зафиксируем пару утверждений:
1) Число -1 не равно числу 4294967295.
2) В документации к функциям ip2long(), crc32() (и может ещё каких-то) нет прямого указания на то, что функция возвращает разные значения (напоминаю, число -1 не равно числу 4294967295) на платформах с разной разрядностью.

Santiago, Lightning --- просьба для начала ответить да/нет.
 

phprus

Moderator
Команда форума
Sad Spirit
1) Число -1 не равно числу 4294967295.
В нашей математике не равно. Для компьютера, при хранении в 32 битной ячейке, если -1 записано в дополнительном коде оба этих числа - это одна и та-же последовательность бит, следовательно эти 32битные ячейки памяти эквивалентны. А вот равны или нет - это зависит от того, как интерпретировать значения в этих ячейках памяти.

В документации к функциям
Это утверждение не верно, так как основано на ложной посылке:
напоминаю, число -1 не равно числу 4294967295)
crc32 и ip2long возвращают ровно 32 бита. Ни битом больше, ни меньше. Но эти 32 бита могут храниться как в ячейке длиной 64 бита, так и в ячейке в 32 бита. По этому с точки зрения компьютера они возвращают одинаковые значения и на 32 и на 64битных системах, а различия возникают из-за того, как программисты интерпретируют полученный результат.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
ура, 4я страница флейма освоена!

Sad Spirit, забей, вырастут из красных галстуков - сами поймут
 

Wicked

Новичок
ахахахаххаа

Для компьютера, при хранении в 32 битной ячейке, если -1 записано в дополнительном коде оба этих числа - это одна и та-же последовательность бит, следовательно эти 32битные ячейки памяти эквивалентны. А вот равны или нет - это зависит от того, как интерпретировать значения в этих ячейках памяти.
если мы возьмем строки "abcd1234" и "1234", получится ровно та же самая ситуация :)
кагбе да, некоторые 32 бита в этих ячейках равны между собой. Да уж, различия возникают из-за того, как программисты интерпретируют результат :)

crc32 и ip2long возвращают ровно 32 бита. Ни битом больше, ни меньше. Но эти 32 бита могут храниться как в ячейке длиной 64 бита, так и в ячейке в 32 бита.
на это я ответил примерно вот тут: http://phpclub.ru/talk/showthread.php?postid=857838#post857838

По-моему, тема свелась к тому, что некоторые несказанно горды за то, что умеют писать на С/С++, забывая при этом, что речь идет про PHP.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
(готовимся к 5й странице)
>В нашей математике не равно.
А Вы сами откуда будете - с Марса или с Юпитера? Надолго к нам?

"Для компьютера" это не значит ничего. Вообще. Он лишь среда для движения электрических зарядов.
Программист определяет значение.
Для программиста это может быть и цвет пикселя, и код символа.
А для программиста -1 не равно 4294967295. Потому что это INT, а не набор битов на перфокарте.
 

Crys

Двинутый новичок
Может я туплю, но у меня сейчас только две страницы в этой теме...

Или это типа, стеб.. -1 равно 4294967295 и 2 страницы равны пяти страницам?
Или это все из-за того, что у меня 32bit-система, а у вас 64bit? :confused:
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Автор оригинала: Wicked
тема свелась к тому, что некоторые несказанно горды за то, что умеют писать на С/С++
та не, все проще
суть проблемы назвали раз 5, источник определили, логика ясна, решение невозможно
(unsigned не добавят, некроссплатформенность не опишут, все, кому надо - знают)
а потыкать пальцем и пофлеймить хоцца!

-~{}~ 19.06.09 16:41:

Crys страниц таки 4 :)
 

Kelkos

Сам себе программер
та не, все проще
суть проблемы назвали раз 5, источник определили, логика ясна, решение невозможно
(unsigned не добавят, некроссплатформенность не опишут, все, кому надо - знают)
а потыкать пальцем и пофлеймить хоцца!
ребят. позырьте в новой версии патч на эту функу: http://bugs.php.net/bug.php?id=47365
Я лично без теста не соображу, что к чему но пара строчек вызывают интерес.
 

Lightning

Трудоголик
Давайте-ка не будем идти по третьему кругу и зафиксируем пару утверждений:
Давайте.
1) Число -1 не равно числу 4294967295.
Да, безусловно.
2) В документации к функциям ip2long(), crc32() (и может ещё каких-то) нет прямого указания на то, что функция возвращает разные значения (напоминаю, число -1 не равно числу 4294967295) на платформах с разной разрядностью.
Да, не указано, т.к. функция возвращает одинаковые значения.

Теперь, уважаемый Sad Spirit, давайте зафиксируем следующие утверждения:
1) Функция ip2long() возвращает не какое-то бессмысленное число, а ip-адрес, который, согласно протоколу, представляет собой четыре байта. В документации написано следующее:
The function ip2long() generates an IPv4 Internet network address from its Internet standard format (dotted string) representation.
2) То, каким образом работать с ip-адресом, решает программист. Если программист хочет работать с ip-адресом как со знаковым целым числом, то он должен предусмотреть особенности работы с целыми, изложенные в документации.

-~{}~ 19.06.09 18:16:

вроде логично
 

Santiago

Новичок
Sad Spirit
1) Да. ЧИСЛА разные, представление может быть разным.
2) Да с одним но. На САМОЙ странице описания функции нет, хотя есть указание " Because PHP's integer type is signed, and many IP addresses will result in negative integers", то в принципе уже должно быть понятно, от чего зависит возвращаемое значение. Если же непонятно, то надо пройти на страницу описания типа int в PHP, где есть прямое указание на платформо-зависимость.
К сожалению, видимо, многие php-разработчики настолько привыкли к тому, что ни коим образом не надо следить за типами данных, с которыми имеют дело, что считают такие случаи багами.

И вопрос к тебе.
Где-то в документации было сказано, что int в PHP - это 32х или 64х битный тип?
Если нет, то почему тогда нао пытаться 64 бита уместить в 32?

ЗЫ С таким же успехом можно пытаться получить bigint из БД и удивляться, почему он не умещается в int. Или это не баг?
ЗЫЫ Можно еще поговорить про числа с плавающей запятой и операцией над ними ;)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Lightning
и чем твой пост отличается от сказанного выше?
Sad Spirit писал о другом :)

Santiago, "в принципе уже должно быть понятно" - совсем не то же, что "понятно".
Sad Spirit намного меньше других "привык не следить за типами данных".
>почему тогда нао пытаться 64 бита уместить в 32
В огороде бузина, а в городе дядька". Перечитай топик.
>получить bigint из БД
без проблем, это будет строка или float.
Но тема не о размерности целых, не про 64->32, а про unsigned 32->signed 64.
Сначала подумай, потом пиши, plz
 

Lightning

Трудоголик
и чем твой пост отличается от сказанного выше?
Суть такая же. Просто я сформулировал более точно.
Sad Spirit писал о другом
Sad Spirit пишет, что функция возвращает разные значения на разных платформах. А на самом деле она возвращает одинаковые.

Ладно, если кто-то считает, что это баг, пусть считает, я спорить не буду.

Но а вообще, не стоит работать с ip-адресами как с signed int.
 

cDLEON

Онанист РНРСlub
Ввести в ПХП как тип unsigned int не мешало бы давно.
Всё таки знак нужен не везде. А проблем доставляет конкретно...
К тому же не только с Ип адресами :)
Возьмите хотя бы определение размера файла больше двух гб....
 

SiMM

Новичок
> Но а вообще, не стоит работать с ip-адресами, как с signed int.
Ну да, и логическими операциями пользоваться тоже не стоит, ога.
 

Wicked

Новичок
нда
а как ты будешь проверять, относится ли ip к некой подсети?
 
Сверху