Печать максимальных значений INT

Я пытаюсь вывести в программе максимальное значение int. Используя следующий код:

#include <stdio.h>
#include <limits.h>
int main(void) {
    printf("%d",INT_MAX);
    return 0;
}

На выходе я получаю :: 2147483647

Но когда я меняю свой printf оператор на printf("%lld",INT_MAX);, мой результат становится 577732524332023807. Значение INT_MAX должно находиться в диапазоне long long int, тогда почему оно не может преобразовать INT_MAX в правильное число в long long int.

Спасибо за любую помощь заранее.


person user007    schedule 05.10.2014    source источник


Ответы (3)


printf - это функция с переменным числом аргументов, она не знает своих типов аргументов, она полагается на получение правильных подсказок в строке формата.

Вы вызвали неопределенное поведение с "%lld", потому что вы не передали long long int.

Чтобы исправить это, нужно провести каст - тогда вы увидите правильный результат:

printf("%lld", (long long int) INT_MAX);

Включить предупреждения компилятора? :)

person Karoly Horvath    schedule 05.10.2014
comment
Большое вам спасибо .. :) И еще сэр, long int и int одинаковы ?? потому что я пытаюсь напечатать printf("%ld",LONG_MAX);, но он дает тот же результат, что и printf("%d",INT_MAX);, но он дает тот же результат .. по любой причине ?? : \ - person user007; 06.10.2014
comment
stackoverflow.com/questions/589575/ - person Karoly Horvath; 06.10.2014
comment
@ user007: Мы говорим, что такое поведение определяется реализацией. Попробуйте сравнить sizeof(int) и sizeof(long). Они должны иметь те же значения (в количестве байтов) для вашего компилятора, но стандарт C говорит только, что sizeof(int) <= sizeof(long int) и требует, чтобы int был не менее 2 байтов и long int не менее 4 байтов. - person Grzegorz Szpetkowski; 06.10.2014
comment
@GrzegorzSzpetkowski Если они имеют одинаковый размер с несколькими компиляторами, тогда какой смысл иметь 2 разных типа данных, если они могут содержать одинаковые значения ?? Я также не думаю, что мы можем выполнять какие-либо специальные функции с long int, а не с int, поскольку они оба являются числами .. - person user007; 06.10.2014
comment
@ user007: Это в основном из-за совместимости между различными реализациями. У некоторых может быть 16-битная int, у кого-то 32-битная и т. Д. - person Grzegorz Szpetkowski; 06.10.2014
comment
@GrzegorzSzpetkowski Спасибо .. :) - person user007; 06.10.2014
comment
Привет, я только что столкнулся с чем-то связанным с этим вопросом stackoverflow.com/questions/1472581/ Разве это тоже не неопределенное поведение ??? Использование %d для печати char ??? Первые ответы на этот вопрос. - person user007; 10.07.2015
comment
@ user007: нет. en.cppreference.com/w/cpp/language/variadic_arguments bool, char , короткие и незаданные перечисления преобразуются в целочисленные типы int или более широкие, как при целочисленном продвижении. - person Karoly Horvath; 10.07.2015

%lld - неверная спецификация для int. По стандарту это неопределенное поведение:

7.21.6.1 Функция fprintf

....

Если какой-либо аргумент не является правильным типом для соответствующей спецификации преобразования, поведение не определено.


7.21.6.3 Функция printf

....

Функция printf эквивалентна fprintf с аргументом stdout, вставленным перед аргументами для printf.

person AlexD    schedule 05.10.2014
comment
Если я напишу printf("%lld",2);, это будет определено ?? - person user007; 06.10.2014
comment
@ user007 Нет. Это не определено. Спецификация формата не соответствует типу. - person AlexD; 06.10.2014
comment
Привет, я только что столкнулся с чем-то связанным с этим вопросом stackoverflow.com/questions/1472581/ Разве это тоже не неопределенное поведение ??? Использование %d для печати char ??? Первые ответы на этот вопрос. - person user007; 10.07.2015

Вы помещаете 4 байта данных (int-length) в стек при вызове функции, а затем указываете функции использовать 8 байтов из стека вызовов для их печати. Таким образом, за вашим значением следуют 4 байта мусора.

Вы можете указать компилятору проверить это.

person Asmyldof    schedule 05.10.2014