c·c++/c 프로그래밍

무식한 c컴파일러 [이상한 출력 :: %d 로 3.1 을 찍을 때]

바로이순간 2011. 12. 8. 10:19

#include <stdio.h>
int main() {
    printf("[[0.5]] [%d] (%d) <%d> \n",0.5, 7);
    printf("[[3.1]] [%d] (%d) <%d> \n",3.1, 11);
    printf("[[0.0]] [%d] (%d) <%d> \n",0.0, 13);
    return 0;
}

 

위의 프로그램을 실행하면 아래와 같이 출력이 나온다.

 

[[0.5]] [0] (1071644672) <7>
[[3.1]] [-858993459] (1074318540) <11>
[[0.0]] [0] (0) <13>

 

위와 같이 출력이 나오는 이유는 0.5 3.1 0.0 이라는 수들이
내부적으로는 double 형으로 되어 있기 때문에 8 바이트를
차지한다.

 

그런데 c컴파일러는 무식해서 자기가 찍어야 하는 것이 12바이트
(double형 8 바이트 + 정수형 4 바이트) 라는 것만 알뿐
구체적인 내용은 모르고 있다.

 

정수형으로 세번 찍으라고 하면 double형을 둘로 잘라서 두번
출력해 준다. 그래서 위와 같이 이해하기 어려운 출력이 나오는
것이다.

 

하지만 이유를 알고 보면 충분히 설명이 된다.