Что на самом деле означает утверждение, что PHP не поддерживает целые числа без знака?

Я использую PHP 7.0.2

В одном месте в руководстве по целым числам я увидел следующее утверждение :

Целые числа могут быть указаны в десятичной (по основанию 10), шестнадцатеричной (по основанию 16), восьмеричной (по основанию 8) или двоичной (по основанию 2) системе счисления, при необходимости перед ними ставится знак (- или +).

и в одном месте в руководстве я увидел ниже противоречивое утверждение:

PHP не поддерживает целые числа без знака.

Из-за этих двух предложений я запутался. В одном месте говорится, что целому числу может необязательно предшествовать знак, что означает, что всякий раз, когда я использую любое целое число, мой выбор будет заключаться в том, чтобы поставить перед ним знак (- или +) или нет.

И в то же время это говорит о том, что PHP не поддерживает целые числа без знака.

Итак, говорит ли он, что всякий раз, когда я использую какое-либо целое число без предшествующего ему знака (+ или -), не будет ли оно считаться допустимым целым числом в PHP?


person PHPFan    schedule 29.12.2017    source источник
comment
Это может означать, что вы не можете настроить диапазон, приведя число как беззнаковое. В MySQL диапазон со знаком составляет от -128 до 127, а диапазон без знака — от 0 до 255. В PHP диапазоны ограничены и не могут быть изменены.   -  person aynber    schedule 29.12.2017
comment
целые числа без знака относятся только к положительным целым числам. PHP поддерживает только целые числа со знаком (= означает, что разрешены префиксы + и -, а + означает по желанию.)   -  person mario    schedule 29.12.2017
comment
@mario: Если это так, то какой знак предшествует целому числу 0 (ноль), поскольку 0 (ноль) не является ни положительным, ни отрицательным целым числом?   -  person PHPFan    schedule 29.12.2017
comment
Какое это имеет отношение к вашему первоначальному вопросу? Мы случайно не зацикливаемся на несущественных определениях?   -  person mario    schedule 29.12.2017
comment
@mario: Я хочу, чтобы мои сомнения были кристально ясными, понимая и зная каждую мелочь.   -  person PHPFan    schedule 29.12.2017
comment
Возможный дубликат целых чисел со знаком и без знака   -  person mario    schedule 29.12.2017
comment
Думайте о числе как о скорости и направлении по оси X, 0 — нет движения. Если числа разделить на две группы, то все положительные и отрицательные числа попадут в одну группу, а один ноль окажется во второй группе. Также в PHP ноль означает ЛОЖЬ, а все положительные и отрицательные целые числа означают ИСТИНА в логическом контексте.   -  person Amr Berag    schedule 29.12.2017


Ответы (2)


Это просто означает, что каждое целое число подписано, и вы не можете создавать целые числа без знака. Поэтому, если вы хотите использовать что-то большее, чем PHP_INT_MAX, вам нужно использовать строки (или какую-нибудь библиотеку, например bcmath), чтобы обойти это.

person Philipp    schedule 29.12.2017
comment
Если это означает, что каждое целое число подписано, и я не могу создавать целые числа без знака, то какой знак, предшествующий целому числу 0 (ноль), поскольку 0 (ноль) не является ни положительным, ни отрицательным целым числом? - person PHPFan; 29.12.2017
comment
PHP (и почти все другие языки) хранят целые числа в виде дополнения до двух. Это означает, что старший бит хранит знак. Для нуля все биты равны нулю, что означает, что бит знака также равен нулю, поэтому ноль является положительным числом. Измените бит знака на 1 и оставьте все остальное равным нулю, равному PHP_INT_MIN - person Philipp; 29.12.2017

Префикс + для обозначения положительного целого числа необязателен, положительные целые числа могут обозначаться без знака или знаком +. Отрицательные целые числа могут обозначаться только знаком -.

Расширение примеров из руководства по работе с целыми числами.

$a = 123; // decimal number (123)
$a = +123; // decimal number (123)
$a = -123; // a negative decimal number (-123)
$a = 0123; // octal number (equivalent to 83 decimal)
$a = +0123; // octal number (equivalent to 83 decimal)
$a = -0123; // octal number (equivalent to -83 decimal)
$a = 0x1A; // hexadecimal number (equivalent to 26 decimal)
$a = +0x1A; // hexadecimal number (equivalent to 26 decimal)
$a = -0x1A; // hexadecimal number (equivalent to -26 decimal)
$a = 0b11111111; // binary number (equivalent to 255 decimal)
$a = +0b11111111; // binary number (equivalent to 255 decimal)
$a = -0b11111111; // binary number (equivalent to -255 decimal)
person Kevin Stich    schedule 29.12.2017