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: , , , , ,

Также рекомендую к прочтению:

6 Responses to “decbin() в PHP”

  1. bes island Says:

    Меня куда больше удивило, что присвоение $n = 4294967295 прошло успешно в 32-битной системе — а система, судя по всему, была 32-битной, ибо в 64-битной как decbin($n), так и decbin($s) вполне успешно покажут 32 единички.

  2. Алексей Токарь Says:

    а ниче удивительного в подразумевании unsigned int
    а тем более в представлении его как float 8-)

  3. bes island Says:

    Кроме того, несмотря на (вероятно, устаревшие) сведения в мануале, decbin в 64-битной системе справляется с числами выше 4294967295.

  4. bes island Says:

    > а ниче удивительного в подразумевании unsigned int

    «PHP does not support unsigned integers» http://php.net/manual/en/language.types.integer.php

  5. Алексей Токарь Says:

    угу. он их просто как float представляет

  6. bes island Says:

    Действительно, мне кажется (надо проверить), я понял: при присвоении $n = 4294967295 в 32-битной системе $n получается float’ом, а не int’ом.

Leave a Reply

Введите следующие символы: