Ноль 0
в качестве начального символа числа является стандартным способом C, чтобы определить, что ниже следует восьмеричное число. Причина, по которой только 08
и 09
дают ошибку, состоит в том, что это недопустимые восьмеричные числа. 01
- 07
- все действительные восьмеричные числа, которые представляют те же десятичные числа 1 - 7, которые вы ожидаете. Это по той же причине, по которой шестнадцатеричные числа 0x0
- 0x9
выглядят так же, как десятичные дроби 0 - 9, при условии, что вы игнорируете 0x
, который указывает на последующие шестнадцатеричные цифры.
Однако 8
и 9
не являются действительными восьмеричными цифрами, точно так же, как A
не является действительной десятичной цифрой, хотя в шестнадцатеричном формате это совершенно нормально, представляя десятичное число 10.
Вам нужно будет удалить начальный ноль 0
, чтобы они считались десятичными числами и работали, как и ожидалось.