Тип нефиксированного целочисленного литерала, такого как 4294967296
, зависит от значения литерала и диапазонов предопределенных типов для реализации.
Тип десятичной константы является первым из:
int
long int
long long int
(восьмеричные и шестнадцатеричные литералы могут быть беззнакового типа;подробности см. в разделе 6.4.4.1 стандарта C99 .)
, в котором его значение может быть точно представлено.Язык требует, чтобы int
составлял не менее 16 бит, long int
- не менее 32 бит, а long long int
- не менее 64 бит, но каждый может быть шире.
В вашей системе (Ubuntu,32 бита, как у меня), int
и long int
- 32 бита, а long long int
- 64 бита, поэтому 4294967296
имеет тип long long int
.(Сообщение, которое вы нам показали, указывает на то, что это long long unsigned int
, что кажется неправильным; вы уверены, что это сообщение, которое вы получили для этого конкретного кода?)
Поведение вызова printf
с аргументомтипа, несовместимого с форматом, не определено.Вы, вероятно, получили 9
в качестве вывода, потому что переданное значение было 0x0000000100000000
, а printf
случайно использовал младшие 32 бита 64-битного значения.Возможно другое поведение.
Вы спрашиваете «Любое предложение», но из вашего вопроса не ясно, что вы хотите сделать.Способ получения результата, который вы, вероятно, ожидали:
puts("4294967296");
, но я уверен, что это не тот ответ, который вы ищете.
Обычно, когда вы печатаете число сprintf
, аргумент будет переменной, а не литералом, а тип будет определяться объявленным типом переменной.Или это может быть более сложное выражение, в этом случае тип определяется типами операндов;если они разных типов, есть умеренно сложный набор правил, определяющих конечный результат.Просто убедитесь, что используемый вами формат соответствует (повышенному) типу аргумента.
Если у вас есть более конкретный вопрос, мы будем рады дать более конкретный ответ.