2015-05-21 5 views
1

Рассмотрим код C ниже:Понимание того, как INT значение переменная хранит в C

#include <stdio.h> 
int main() 
{ 
    int i = 012; 
    printf("%d", i); 
} 

В O/P значение i печатается 10. Я знаю, (012) = (10) . Но я смущен тем, что C хранит значения переменных int. Может ли кто-нибудь объяснить это мне?

+6

Вы устанавливаете 'i' в восьмеричный 012 и' printf() 'it в десятичной системе ('% d'), что равно 10. Что в этом запутано? – EOF

+1

В коде отсутствует 'c'. –

+0

@ KerrekSB-LOL, OP говорит о языке C. –

ответ

-3

Насколько я знаю, это обработчик целых чисел C, который видит ведущее 0, а затем интерпретирует его как базу 8 или восьмеричную константу.

Извините за просто перенаправлять вас, но я боюсь, что я не мог сказать, что это лучше, чем Abimaran Кугатасан в этом посте:

Why int j = 012 giving output 10?

Для более глубокого объяснения смотрите ответ на bdonlan здесь: How does C Handle Integer Literals with Leading Zeros, and What About atoi?

+2

ОП утверждает, что это восьмеричное значение, также это может быть комментарий вместо ответа, потому что после того, как вы перенаправляетесь на другие сообщения в SO, это означает, что этот вопрос может быть отмечен как дубликат. –

+1

Я еще не могу прокомментировать :( – Nick

+0

Все еще ваш ответ принят, и все не отвечает на вопрос, и это также ответ только на ссылку. Тот факт, что ответ принят, не означает, что он т. е. поддерживать. –

7

Они хранятся в двоичном формате, вы можете использовать множество представлений для их определения, но в конце это бинарное представление, которое используется.

1

Аппаратная память работает с bytes. Таким образом, любая переменная (int, char, pointer или array of the) в вашей программе в конце будет преобразована в байты. Как «C» сделает это, это снова зависит от оборудования. См. Endianness и Size of int long type.

Скажем, у вас есть 32-разрядный компьютер с маленькими концами. Любой «int» в 32-битном мире будет храниться как четыре последовательных байта в памяти. Это означает, что в вашем случае все, что буквальное будет использовать, это либо «012» или «10», он будет храниться так:

binary: 00001010 00000000 00000000 00000000 
octal:   12  0  0  0 
decimal:  10  0  0  0 
hex:   A  0  0  0 

в четырех последовательных байтов памяти.

0

Все значения: сохранены с использованием двоичного представления (это верно для целых чисел, поплавков, символов и т. Д.). Значение 10 (десятичное) сохраняется как последовательность двоичных цифр 00000000000000000000000000001010 (при условии, что существует 32-разрядный тип int).

В операторе присваивания, как

i = 012; 

компилятор знает, как преобразовать строку восьмеричных цифр в буквальном 012 в двоичном представлении выше. Ведущий 0 сообщает компилятору, что это значение представлено в восьмеричном представлении, иначе оно попытается сохранить десятичное значение 12 (00000000000000000000000000001100).

В printf заявлении

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

спецификатор преобразования %d говорит printf, чтобы отобразить значение, хранящееся в i отформатированный в виде строки десятичных цифр (10). Аналогично, спецификатор преобразования %x отображает значение, отформатированное как строка шестнадцатеричных цифр (a).

Смежные вопросы