![]() |
Ошибки PHP - знаки чисел, int32 и int64
В этой небольшой статейке расскажу о некоторых неприятных ошибках (багофичах) PHP, которых нужно иногда остерегаться.
Случайно заметил в PHP такую вещь - он весьма посредственно обходится со знаками чисел, а также путает int32 и int64, неправильно их определяя. Пример: PHP код:
Но это еще не самое удивительное. Можно взять такой пример: PHP код:
Еще несколько примеров: PHP код:
PHP код:
PHP код:
Поэкспериментировав, я сделал вывод, что PHP: 1. Способен спутать знак числа при побитовых операциях. 2. В операциях сдвига и побитовых операциях всегда принимаются во внимание только 32 разряда числа, даже если это int64. Остальные разряды просто отбрасываются. К этим операторам относятся все вроде &, |, ^, ~, <<, >>. Вот кстати еще пример: PHP код:
3. Ошибка происходит даже в арифметической операции % (взятие остатка от деления)! Пример: PHP код:
4. Советую также не сравнивать большие числа, если требуется большая точность. Скажем, PHP посчитает числа 18446744073709551610 и 18446744073709551619 равными, так как у него в памяти они представлены в виде 1.84467440737E+19 оба. Не ошибались в размерностях только операторы +, -, *, /, ++, --. Не производите сложных вычислений на PHP, особенно с большими числами, это может закончиться плачевно. PS. Если что по операциям непонятно, или если вас бинарный вид числа пугает - спрашивайте, поясню. Perl кстати ошибался меньше, но в побитовых операциях, вроде &, всё равно присутствовали ошибки. Будьте с ним тоже осторожнее. |
Цитата:
|
Цитата:
|
d_x, дело не в пхп.
Код:
#include <stdio.h>ps: http://ru.php.net/manual/en/language.operators.bitwise.php Цитата:
|
Цитата:
|
d_x К сожалению, вы заблуждаетесь. Разделение int32 и int64 - в ПХП нет. int - может быть 64 разрядным на _некоторых_ системах, но на руках мы опять-таки будем иметь число от -2^63+1 до 2^63-1 (или -2^31+1 до 2^31-1 но никак не ^32) за счет того, что беззнаковых целых в ПХП - нет. Плюс сам ПХП для винды - x86 по дефолту, сделать поддержку 64 бит - поленились.
Далее шаманство с числами. Любое число выходящее за пределы PHP_INT_MAX - автоматически приводится к типу float. Возьмем любой пример: PHP код:
1) Не получится играться с битовыми операциями, ибо Цитата:
Цитата:
З.Ы. Погрешности компьютерных измерений - достаточно интересная тема, жалко экзамен по этой теме я завалил( |
Gifts, спасибо, теперь всё понятно стало. Действительно, из-за float не работают битовые операторы и взятие остатка от деления. Преобразование неявное, поэтому было непонятно. Забавно, что ++ и -- работают с float.
|
d_x А почему бы им не работать, обычный инкремент на единицу. Да и, например, можно сколько угодно применять $a-- к числу большему ~1E16 (для 32бит) или 1E20 (для 64 бит), оно от этого не изменится
З.Ы. в пхп почти все не явно и "как бы упрощая", но на самом деле плодя ошибки, в отличие от питона, например :p |
| Время: 05:11 |