decbin() в PHP
Сегодня maxic задал интересную задачку
Вернее не сама задача, а ее последствия.
Итак.
Имеем число 4294967295
$n = 4294967295;
Теперь попробуем найти его в двоичное значение:
echo decbin( $n );
Все нормально. Как и ожидали - 32 единички.
А если это число пришло к нам из БД? То оно будет представлено изначально в виде строки:
$s = '4294967295';
И если мы его попробуем преобразовать, то получим всего 31 единичку…
Хм. Каким бы странным это не казалось - оказалось, что преобразование строки в int может быть до 2147483647 и не более. В таких случаях нас спасает ручное преобразование к числу с плавающей запятой:
$s = '4294967295';
echo decbin( floatval( $s ) );
Вот они наши 32 единички!!
А вот официальные объяснения:
decbin. Returns a string containing a binary representation of the given number argument. The largest number that can be converted is 4294967295 in decimal resulting to a string of 32 1’s.
intval. The maximum value depends on the system. 32 bit systems have a maximum signed integer range of -2147483648 to 2147483647. So for example on such a system, intval(’1000000000000′) will return 2147483647. The maximum signed integer value for 64 bit systems is 9223372036854775807.
Tags: float, int, PHP, парадокс, преобразование типов, решение
Также рекомендую к прочтению:
Август 15th, 2008 at 14:59
Меня куда больше удивило, что присвоение $n = 4294967295 прошло успешно в 32-битной системе — а система, судя по всему, была 32-битной, ибо в 64-битной как decbin($n), так и decbin($s) вполне успешно покажут 32 единички.
Август 15th, 2008 at 15:00
а ниче удивительного в подразумевании unsigned int
а тем более в представлении его как float
Август 15th, 2008 at 15:01
Кроме того, несмотря на (вероятно, устаревшие) сведения в мануале, decbin в 64-битной системе справляется с числами выше 4294967295.
Август 15th, 2008 at 15:02
> а ниче удивительного в подразумевании unsigned int
«PHP does not support unsigned integers» http://php.net/manual/en/language.types.integer.php
Август 15th, 2008 at 15:03
угу. он их просто как float представляет
Август 15th, 2008 at 15:06
Действительно, мне кажется (надо проверить), я понял: при присвоении $n = 4294967295 в 32-битной системе $n получается float’ом, а не int’ом.