Как работает Leading Zero в php?

Предположим, у меня есть код, который выводит $i как

$i = 016;
echo $i / 2;
//ans will be 7

Я знаю, что начальный ноль указывает на восьмеричное число в PHP, но как это интерпретируется, как это может быть выполнено? Может ли кто-нибудь поделиться его выполнением шаг за шагом? Какова роль парсера здесь? Я много исследовал и прочитал все предыдущие ответы, но ни у кого нет глубокого объяснения.


person Jaymin    schedule 17.08.2017    source источник
comment
взгляните на php.net/manual/en/language.types.integer. php   -  person Chetan Ameta    schedule 17.08.2017
comment
Интерпретатор выполняет преобразование на этапе компиляции. Первая строка кода создает те же коды операций, что и $i = 14;.   -  person axiac    schedule 17.08.2017
comment
Что значит глубокое объяснение? Парсер видит целое число с ведущим 0 и интерпретирует его как восьмеричное число, вот и все!? :D   -  person xander    schedule 17.08.2017
comment
Да, вы можете ответить на него в столбце ответов, дав надлежащее объяснение, мы оценим ваши усилия.   -  person Jaymin    schedule 17.08.2017


Ответы (2)


Когда в PHP перед целыми числами ставится ноль, в этом случае 029.

Он становится восьмеричным.

Поэтому, когда вы повторяете это, оно преобразуется в десятичную форму.

Что приводит к:

echo 016; //14 (decimal) valid octal

echo 029; // 2 (decimal) -  Invalid octal

На самом деле это указано в руководстве.

Допустимый восьмеричный:

octal       : 0[0-7]+

Примечание. До PHP 7, если в восьмеричном целом числе была указана недопустимая цифра (например, 8 или 9), остальная часть числа игнорировалась. Начиная с PHP 7 выдается ошибка синтаксического анализа.

person Chetan Ameta    schedule 17.08.2017
comment
Да, ваш ответ кажется идеальным для объяснения, единственное, что я хотел бы изменить, это от 029 до 2, поскольку он не дает идеального десятичного числа, вместо этого используйте от 016 до 14, чтобы любой мог легко его интерпретировать. Благодаря тонну :) - person Jaymin; 17.08.2017
comment
@JayminNoob: 029 - недопустимый восьмеричный литерал, так что же он должен делать тогда? - person Ignacio Vazquez-Abrams; 17.08.2017
comment
@IgnacioVazquez-Abrams IgnacioVazquez-Abrams Я упомянул то же самое, выше, что, если это недопустимый восьмеричный литерал, что он делает дальше? - person Jaymin; 17.08.2017
comment
@JayminNoob у меня есть addec 016, а также для недопустимого восьмеричного я добавил примечание в конце ответа - person Chetan Ameta; 17.08.2017

Восьмеричная система счисления, или сокращенно октальная, представляет собой систему счисления с основанием 8, в которой используются цифры от 0 до 7.

Восьмеричные числа можно получить из двоичных, сгруппировав последовательные двоичные цифры в группы по три (начиная справа).

Например, двоичное представление для десятичного числа 74 — 1001010. Два нуля можно добавить слева: (00)1 001 010, что соответствует восьмеричным цифрам 1 1 2, что дает восьмеричное представление 112.

В вашем вопросе $i = 016; вычисляется интерпретатором и выдает $i = 14; (что является эквивалентным десятичным числом)

Затем вы просто делите его на 2, что дает 7.

person Sotiris Kiritsis    schedule 17.08.2017
comment
что, если это недопустимый восьмеричный литерал, что он делает дальше? - person Jaymin; 17.08.2017