В C, сохраняющие значения, которые начинаются с нуля, видоизменяются, почему? - PullRequest
4 голосов
/ 23 ноября 2011

Например:

int main(){

    int x = 01234567;

    printf("\n%d\n",x);

    return 0;

}

Следующий код выдает: 342391

Если я не включил 0 в начале, значение x было бы 1234567, почему C хранитзначение таким образом, и есть ли способ получить его от этого?

Ответы [ 4 ]

12 голосов
/ 23 ноября 2011

Поскольку числа, начинающиеся с 0, представлены как восьмеричные числа .Вы не можете реально изменить это поведение, просто не включайте ноль в начале.

8 голосов
/ 23 ноября 2011

Числовые константы, начинающиеся с 0, интерпретируются как основание 8.

7 голосов
/ 23 ноября 2011

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

По сути, все, что вы можете здесь сделать, это не ставить начальные 0 на целочисленные константы.

4 голосов
/ 23 ноября 2011

Во время компиляции C-компилятор идентифицирует любые целочисленные литералы в вашем коде и затем интерпретирует их с помощью набора правил, чтобы получить их двоичное значение для использования вашей программой:

  • Base-16 (Шестнадцатеричный) - любые целочисленные литералы, начинающиеся с '0x', будут рассматриваться как шестнадцатеричное значение.Таким образом, int x = 0x22 дает x десятичное значение 2 * 16^1 + 2 * 16^0 = 34.
  • Base-8 (Octal) - любые целочисленные литералы, начинающиеся с '0', будут рассматриваться как восьмеричное значение.Таким образом, int x = 022 дает x десятичное значение 2 * 8^1 + 2 * 8^0 = 18.
  • Base-10 (десятичное число) - любые целочисленные литералы, не соответствующие двум другим правилам, будут обрабатываться как десятичное значение.Так int x = 22 дает x десятичное значение 22.

Следует отметить, что GCC поддерживает расширение , которое предоставляет другое правило для указания целых чисел в двоичном формате.,Кроме того, эти методы спецификации поддерживаются только для целочисленных литералов во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...