2014-10-05 2 views
2

Я пытаюсь напечатать максимальное значение 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.

Благодарим за любую помощь заранее.

ответ

7

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

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

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

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

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

+0

Большое вам спасибо .. :) и сэр еще одна вещь - 'long int' и' int' одинаково ?? потому что я пытаюсь напечатать 'printf ("% ld ", LONG_MAX) ;, но он дает тот же результат, что и' printf ("% d", INT_MAX); 'но он дает тот же результат .. любая причина ?? : \ – user007

+0

http://stackoverflow.com/questions/589575/what-does-the-c-standard-state-the-size-of-int-long-type-to-be –

+1

@ user007: Мы говорим, что такие поведение определяется реализацией. Попробуйте сравнить 'sizeof (int)' и 'sizeof (long)'. Они должны иметь одинаковые значения (в байтах) для вашего компилятора, но в стандарте C только сказано, что 'sizeof (int) <= sizeof (long int)' и требует, чтобы 'int' составлял не менее 2 байтов, а' long int 'не менее 4 байтов. –

6

%lld неправильная спецификация для int. Согласно стандарту, это неопределенное поведение:

7.21.6.1 fprintf функция

....

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


7.21.6.3 printf функция

....

printf функция эквивалентна fprintf с аргументом stdout я nterposed до аргументов printf.

+1

Если я напишу 'printf ("% lld ", 2);' это будет определено? – user007

+2

@ user007 No.Он не определен. Спецификация формата не соответствует типу. – AlexD

+0

Большое вам спасибо. :) – user007

5

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

Вы можете сообщить компилятору об этом.

+0

Спасибо так много .. :) – user007

+0

@ user007 Не беспокойтесь. – Asmyldof

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