2학년인데 강제 형변환쪽을 수업하다 실습시간에 내 후배가 물어봐서 코드를 봤는데 아래처럼 나옴.


#include <stdio.h>
int main()
{
    int a=8;
    int b=0;
    double c = 2.5;
    b = a*c;
    printf("%d, %lf, %d", c, c, b); //4byte 8byte 4bye
}


출력이

0, 0.000000, 1074003968 가 나와서 이상하다고 했음.


--- 이하 내가 분석해본 내용


처음에 컴파일러 문제인가 해서 컴파일러 여러개 써봤는데 똑같이 나왔음.(visual, intel, mingw, clang, c++ builder, 리눅스 gcc)


출력은
0, 0.000000, 1074003968 (x86)
0, 2.500000, 20 (x64)


다른 방법으로


1074003968를 변환해봄

10진수: 1074003968 => 10자리
16진수: 40040000 => 8자리
2진수: 1000000000001000000000000000000 => 31자리
8진수: 10001000000 => 11자리


20을 int형으로

0000 0000 0000 0000 0000 0000 0001 0100(2)
0000 0014(HEX)


2.5를 float이랑 double형으로

2.5 -> float

01000000001000000000000000000000
1075838976(10)
40200000(16)


2.5 -> double

0100000000000100000000000000000000000000000000000000000000000000(2)
4612811918334230528(10)
4004000000000000(16)


여기서 내가 생각한것이 확실히 1074003968이 2.5를 double형으로 변환한거랑 관계가 있는거 같았음.


메모리에 들어가는게

%d, %lf, %d(double, double, int)라서


2.5, 2.5 20의 오리지널 DATA

4004 0000 0000 0000, 4004 0000 0000 0000, 0000 0014


32bit READ
4004(안읽음) 0000(읽음, 0출력) 0000 0000(읽음, 0.000000출력) 4004 0000(읽음, 1074003968출력) 0000 0000 0000 0014
64bit READ
4004 0000(안읽음) 0000 0000(읽음, 0출력) 4004 0000 0000 0000(읽음, 2.500000출력) 0000 0014(읽음, 20출력)


인거 같은데 맞나 모르겠네.. 컴퓨터는 진짜 알다가도 모르겠어 T.T