2012-01-07 3 views
1

Предположим, что речь идет о 32-битной системе.Максимальный размер INT для 32-битной системы

PHP не поддерживает неподписанные INT. Это означает, что значение INT должно составлять от -2,147,483,648 до 2,147,483,647. И INT занимает 4 байта для хранения значения, длина которого равна 32 битам.

Значит ли это, что у меня есть только 31 бит для значения и 1 бит для знака? Или я могу использовать целые 32 бита для хранения значения?

ответ

4

Вы: :, используя все 32 бита. Просто функции вывода по умолчанию интерпретируют как подписанное целое число.Если вы хотите, чтобы отобразить значение «сырое» Использование:

printf("%u", -1); // %u for unsigned 

Поскольку PHP обрабатывает целые числа подписаны, однако внутренне, вы можете использовать только битовую арифметику, но не сложение/умножение и т.д. с ними - если вы ожидаете их ведут себя как unsigned ints.

0

Обычно с 32-битными целыми значениями разница между подписанным и неподписанным является именно тем, как вы интерпретируете значение. Например, (-1) +1 будет равным 1 для подписанных и неподписанных, для подписанных это очевидно, и для unsigned это, конечно, только true, если вы просто перебиваете переполнение. Таким образом, у вас есть 32 бита для хранения значений, это просто так, что есть 1 бит, который интерпретируется иначе, чем остальные.

1

Прежде всего, если вы хотите выполнять вычисления с огромными числами (например, более 10 000), вы должны использовать произвольный модуль точности bcmath.

Во-вторых, официальная реализация php использует внутренний код Two's complement для представления чисел, как и практически всех других компиляторов и интерпретаторов. Поскольку entropy подписанного бита (если вы считаете 0 положительным [1]) равно 1, а энтропия 31 бит - это 31, вы можете сохранить 2 = 4 294 967 296 различных значений. Как вы толковать это зависит от вашего приложения.


[1] - 0 не является ни положительным, ни отрицательным.

0

Дополнение от 2-х наиболее часто используется для хранения чисел, а это означает, что 1 бит не будет потрачен впустую только для знака.

http://en.wikipedia.org/wiki/Two's_complement

В PHP, если число переполняет INT_MAX для платформы, он преобразует его в значение с плавающей точкой.

0

2147483647 - обычное значение 2^31-1. 1 бит для знака и -1, потому что мы также представляем 0.

из руководства: «Размер целого зависит от платформы, хотя максимальное значение около двух миллиардов - это обычное значение (это 32 бита, подписанные). 64-разрядные платформы обычно имеют максимальное значение около 9E18. PHP не поддерживает целые числа без знака. Целочисленный размер может быть определен с использованием константы PHP_INT_SIZE и максимального значения с использованием константы PHP_INT_MAX с PHP 4.4.0 и PHP 5.0.5. "

1

Насколько я знаю, на 32-битной системе наибольшее положительное целое возможное 2147483647 выше значения будут значения с плавающей точкой, так как значение с плавающей точкой в ​​PHP может принимать значения до 10000000000000.

+0

Наибольшее значение поплавка зависит от платформы, но, безусловно, более 10 000 000 000 000 (1e13). PHP на моих системах, кажется, ограничен 1.7976e308. – Borodin

0

Да, если бы использовали unsigned integer, он будет использовать 32 бита для хранения, так как вам не нужен знак в этом случае, но поскольку он поддерживает только целые числа со знаком, 32-битные системы будут иметь 31 бит для значения и 1 бит для знака s0 максимальный знаковый целочисленный диапазон -2147483648 до 2147483647.

 Смежные вопросы

  • Нет связанных вопросов^_^