2014-10-05 10 views
2

최대 값 int을 프로그램에 인쇄하려고합니다. 다음 코드를 : 사용 INT의 최대 값 인쇄

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

내가 얻을 출력은 내 출력 577732524332023807된다 printf("%lld",INT_MAX);printf 문을 변경할 때, :: 2147483647

하지만. INT_MAX 값이 long long int 범위 내에 있다고 가정하면 long long int의 올바른 숫자로 INT_MAX을 변환 할 수없는 이유는 무엇입니까?

사전에 도움을 주셔서 감사합니다.

답변

7

printf은 가변 인수 함수이며 인수 유형을 알지 못하므로 형식 문자열에서 올바른 힌트를 수신해야합니다.

long long int을 전달하지 않았기 때문에 정의되지 않은 동작이 "%lld"으로 호출되었습니다.

를 해결하려면, 당신은 캐스팅 할 필요 - 당신이 올바른 결과가 나타납니다 :

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

%lldint의 잘못된 사양입니다. 표준에 따르면, 정의되지 않은 동작이다

7.21.6.1 fprintf 함수

.... 인수가 해당 전환 사양 하지 올바른 유형이면

, 동작은 입니다.


7.21.6.3 printf 함수

....

printf 함수는 인수 fprintf 동등 stdout I 인수가 printf에 이르기 전에 에 중첩됩니다.

+1

만약'printf ("% lld", 2);라고 쓰면 그 값이 정의 되나요 ?? – user007

+2

@ user007 No.그것은 정의되지 않았다. 형식 사양이 형식과 일치하지 않습니다. – AlexD

+0

고맙습니다. :) – user007

5

함수의 호출에서 스택에 4 바이트의 데이터 (int-length)를 푸시 한 다음 함수에 호출 스택에서 8 바이트를 소비하도록 지시합니다. 따라서 귀하의 가치는 4 바이트의 쓰레기로 뒤덮입니다.

컴파일러에게이를 확인하도록 알릴 수 있습니다.

+0

감사합니다. 너무 많이 .. :) – user007

+0

@ user007 걱정할 필요가 없습니다. – Asmyldof