Предположим, мы говорим о 32-битной системе.
PHP не поддерживает unsigned INT. Это означает, что значение INT должно составлять от -2,147,483,648 до 2,147,483,647. И INT занимает 4 байта для хранения значения, длина которого равна 32 битам.
Значит ли это, что у меня есть только 31 бит для значения и 1 бит для знака? Или я могу использовать целые 32 бита для хранения значения?
Вы используете все 32 бита. Просто функции вывода по умолчанию интерпретируют его как целое число со знаком. Если вы хотите отобразить значение «raw», используйте:
printf("%u", -1); // %u for unsigned
Поскольку PHP обрабатывает целые числа, подписанные внутри, однако, вы можете использовать только битовую арифметику, но не добавление / умножение и т. Д., Если вы ожидаете, что они будут вести себя как беззнаковые int.
Насколько я знаю, в 32-битной системе наибольшее положительное целое число – это значения 2147483647 выше, будут значения float, так как значение float в php может принимать значения до 10000000000000.
Прежде всего, если вы хотите делать вычисления с огромными числами (например, более 10k), вы должны использовать произвольный модуль точности bcmath .
Во-вторых, официальная реализация php использует внутреннее дополнение Two для представления чисел, как и практически всех других компиляторов и интерпретаторов. Поскольку энтропия знакового бита (если вы считаете 0 положительным [1] ) равна 1, а энтропия 31 бита – ну, 31, вы можете сохранить 2 32 = 4 294 967 296 различных значений. Как вы их интерпретируете, зависит ваше приложение.
[1] – 0 не является ни положительным, ни отрицательным.
Обычно с 32-битными целыми значениями разница между подписанным и unsigned – это то, как вы интерпретируете значение. Например, (-1) +1 будет равным 1 для подписанных и неподписанных, для подписанных это очевидно, и для unsigned это, конечно, только true, если вы просто перебиваете переполнение. Таким образом, у вас есть 32 бита для хранения значений, это просто так, что есть 1 бит, который интерпретируется иначе, чем остальные.
Два дополнения чаще всего используются для хранения чисел, а это означает, что 1 бит не будет потрачен впустую только для знака.
http://en.wikipedia.org/wiki/Two's_complement
В PHP, если число переполняет INT_MAX для платформы, оно преобразует его в значение с плавающей запятой.
2147483647 – обычное значение 2 ^ 31-1. 1 бит для знака и -1, потому что мы также представляем 0.
из руководства: «Размер целого зависит от платформы, хотя максимальное значение около двух миллиардов – это обычное значение (это 32 бита). 64-разрядные платформы обычно имеют максимальное значение около 9E18. поддержка целых чисел без знака. Целочисленный размер может быть определен с использованием константы PHP_INT_SIZE и максимального значения с использованием константы PHP_INT_MAX с PHP 4.4.0 и PHP 5.0.5. "
Да, если бы он использовал целое число без знака, он будет использовать 32-битное, чтобы сохранить его, поскольку в этом случае вам не нужен знак, но поскольку он поддерживает только целые числа со знаком, 32-битные системы будут иметь 31 бит для значения и 1 бит для знака s0 максимум значный целочисленный диапазон от -2147483648 до 2147483647.