Как C Обрабатывает Целочисленные Литералы с Начальными нулями, и Что относительно atoi?

using гарантии* созданный объект будет расположен в конце блока, даже если исключение будет выдано. Исключение не поймано. Однако необходимо быть осторожны относительно того, что Вы делаете, при попытке поймать его сами. Так как любой код, который ловит исключение, выходит за рамки блок, определенный using оператор, Ваш объект не будет доступен тому коду.

*barring обычные подозреваемые как сбой питания, ядерный Холокост, и т.д.

8
задан Kyle Brandt 2 November 2009 в 03:55
поделиться

7 ответов

Начальные нули указывают, что число выражено в восьмеричное или основание 8; таким образом, 010 = 8. Добавление дополнительных ведущих нулей не имеет никакого эффекта; как и следовало ожидать в математике, x + 0 * 8 ^ n = x; нет никакого изменения значения путем увеличения его представления.

Вы часто видите это в файловых режимах UNIX; 0755 на самом деле означает 7 * 8 ^ 2 + 5 * 8 + 5 = 493; или с umasks, например 0022 = 2 * 8 + 2 = 10.

atoi (nptr) определяется как эквивалент strtol (nptr, (char **) NULL, 10) , за исключением того, что он не обнаруживает ошибок - как таковая, atoi () всегда использует десятичные числа (и, таким образом, игнорирует начальные нули). strtol (nptr, something, 0) выполняет следующие действия:

Строка может начинаться с произвольного количество белого пространства (как определено на isspace (3) ), за которым следует один необязательный знак '+' или '-' . Если база ноль или 16, строка может включить префикс «0x» и номер будет читаться по базе 16; в противном случае нулевая база принимается как 10 (десятичная) если следующий символ не '0' , в в этом случае он берется как 8 (восьмеричный).

Таким образом, он использует те же правила, что и компилятор C.

33
ответ дан 3 November 2019 в 12:09
поделиться

Будьте осторожны!

В этом утверждении 005 - восьмеричная константа.

int a = 005;

В этом случае это не имеет значения, потому что однозначная восьмеричная константа имеет то же значение, что и эквивалентная десятичная константа, но в C: 015! = 15

Независимо от того, выражается ли целочисленный литерал в восьмеричном, десятичном или шестнадцатеричном формате, после его анализа компилятором он просто обрабатывается как значение. То, как целое число выводится через printf , зависит только от его типа, его значения и спецификаторов формата (и активного языкового стандарта).

7
ответ дан 3 November 2019 в 12:09
поделиться

Тот факт, что начальный ноль указывает на восьмеричное число, часто забывают. Я видел, как это несколько раз приводило к путанице, например, когда кто-то пытался ввести IP-адрес, используя хороший, обычный формат для октетов:

192.168.010.073

, а синтаксический анализатор интерпретировал последние 2 октета как восьмеричные числа.

Единственное. вещь хуже, чем неудачное использование C начальных нулей для создания восьмеричного числа, - это Javascript ' s обработка начальных нулей в иногда делает число восьмеричным (число является восьмеричным, если остальные цифры в порядке - меньше 8 - в противном случае - десятичным). В Javascript (017 == 15) , но (018 == 18) .

Я бы предпочел, чтобы была ошибка; на самом деле я бы предпочел вообще отказаться от восьмеричной буквальной поддержки. По крайней мере, используйте приставку, которая будет более откровенной, например, может быть

0t10  (ocTal 8)
0k17  (oKtal 15)

Но я опоздал примерно на 35 лет с моим предложением.

7
ответ дан 3 November 2019 в 12:09
поделиться

Число с начальным нулем означает восьмеричное кодирование во всех версиях C. Итак 011 == 9 == 0x9 .

Восьмеричная система счисления основана на 8 (вместо 10 для десятичной или 16 для шестнадцатеричной). Итак 011 == 1 * 8 + 1, 013 == 1 * 8 + 3 и т. Д.

5
ответ дан 3 November 2019 в 12:09
поделиться

] Вам следует попробовать:

int a = 5;
printf("%03i\n", a);

0 означает «блокнот с нулями», 3 - желаемая длина вывода.

Изменить: Извините, я прочитал ваш вопрос слишком быстро - теперь я вижу, что вы спросили о чем-то совершенно другом. Тем не менее, я'

3
ответ дан 3 November 2019 в 12:09
поделиться

Целые числа не имеют "начальных нулей", а 5 - это 5, вы можете записать его строковое представление с начальным 0, если хотите, для этого у вас есть модификаторы printf.

1
ответ дан 3 November 2019 в 12:09
поделиться

Я нашел ответ на этот вопрос (от эта страница ):

Библиотека bigarray реализует большие многомерные числовые массивы. Эти массивы называются «большими массивами», чтобы отличать их от стандартных массивов Caml, описанных в Модульном массиве. Основные различия между «большими массивами» и стандартными массивами Caml заключаются в следующем:

  • Большие массивы не ограничены по размеру, в отличие от массивов Caml (массив с плавающей запятой ограничен 2097151 элементом на 32-битной платформе, другие типы массивов до 4194303 элементов).
  • Большие массивы многомерны. Поддерживается любое количество размеров от 1 до 16. Напротив, массивы Caml являются одномерными и требуют кодирования многомерных массивов как массивов массивов.
  • Большие массивы могут содержать только целые числа и числа с плавающей запятой, в то время как массивы Caml могут содержать произвольные типы данных Caml. Однако большие массивы обеспечивают более эффективное хранение целочисленных элементов и элементов с плавающей запятой, в частности потому, что они поддерживают «маленькие» типы, такие как числа с плавающей запятой одинарной точности и 8- и 16-битные целые числа, в дополнение к стандартным типам Caml типа double -precision с плавающей точкой и 32- и 64-битными целыми числами.
  • Структура памяти больших массивов полностью совместима с массивом в C и Fortran, Все начальные нули удаляются компилятором, за исключением начального нуля, который заставляет ваш компилятор рассматривать целое число как восьмеричное. Для 005 и восьмеричное, и десятичное представление одинаковы и не должны вас беспокоить, но, тем не менее, это вызывает проблемы, если вы специально не имели в виду восьмеричное представление.

    Начальные нули должны иметь дело исключительно со строковым представлением целого числа. Для печати с ведущими нулями используйте «% 03d». Это обеспечит длину поля равную 3.

    Как правило, «% d» выводит целое число шириной x символов и дополняет его ведущими пробелами. "% 0 d" будет делать то же самое, но будет дополнять его ведущими нулями.

0
ответ дан 3 November 2019 в 12:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: