2015-12-07 4 views
3

В этом спецификаторе формата% d следует читать 4 байта, являющихся спецификатором целочисленного формата, но x, являющийся символом, сохраняется только в 1 байт. поэтому оставшиеся 3 байта должны иметь значение мусора, а выход должен быть случайным. Но выход всегда приходит 97, который является значением ASCII 'a'. Может ли кто-нибудь сказать, как работает спецификатор формата?Как работает спецификатор формата% d?

+0

Я думаю, это потому, что 'char x' повышается до' DWORD' в стеке. – Neijwiert

+1

@Neijwiert: на языке C нет «стека». –

+0

@KerrekSB Я говорю о скомпилированном коде под языком 'C'. Это может объяснить это поведение. – Neijwiert

ответ

12

Аргументов функций, которые не соответствуют заявленному типу параметра функции (то есть, поскольку функция позволяет переменные аргументы, как printf, или потому что прототип функции не предусмотрен) претерпевает продвижение по службе аргумента умолчанию: (ср C11 6.5.2.2), которые превращают значение char в значение int или unsigned int. Поэтому, проходя a по printf соответствует требованиям для %d.

+1

В стандарте C, если 'int' может представлять все значения' char', значение 'char' будет присвоено' int', в противном случае оно будет переведено в 'unsigned int'. Таким образом, в большинстве реализаций ему будет присвоено значение 'int', потому что единственный случай, когда' int' не может представлять все значения 'char', - это когда' char' и 'int' имеют одинаковый размер (т. Е. Когда 'sizeof (int) == 1'), а' char' - без знака. Такие реализации довольно редки! –

+0

Итак, я слышал, хотя я еще не встречал такую ​​платформу. –

+0

#include main() { int x; x = 1; printf ("% lld", x); } Это дает вывод 11821485165379585, который является случайным числом. Это связано с тем, что% lld считывает 8 байтов, но int составляет 4 байта. то же самое должно быть в моем случае –

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