이 문서는 C 언어에서 int 형 값을 double 형으로 변환할 때 내부적으로 어떤 일이 벌어지는지를 정리한 것이다.
double result = (double)num1 / num2;일 때, num1만 double로 형변환했는데, num2는 언제 double이 되는가?(double)num1처럼 명시적으로 변환하면 메모리 공간이 4바이트에서 8바이트로 확장되는가?xmm0, xmm1에 저장된다는 게 무슨 의미이고, 레지스터 크기는 얼마인가?num1, num2의 메모리 크기도 8바이트로 바뀌는가?C 언어에서
int를double로 형변환하면, 값만 일시적으로 8바이트 double로 해석되며, 원래 변수의 메모리 크기는 변하지 않는다.
(double)num1은 num1의 값을 double로 해석하라는 지시이지, 실제 메모리를 8바이트로 바꾸는 것이 아님.int 타입 선언 시점에 이미 4바이트로 고정되어 있다.(double)num1이 연산에 사용되면, num2는 자동으로 double로 변환됨 (암시적 형 변환).cvtsi2sd xmm0, eax 명령어를 사용해 int 값을 double로 변환하여 xmm0에 저장.xmm 레지스터는 128비트(16바이트) 크기이며, double 하나는 하위 8바이트에 저장됨.divsd xmm0, xmm1 등 SSE 명령어로 처리됨.mov eax, DWORD PTR [num1] ; 메모리에서 4바이트 int값을 레지스터로 불러옴
cvtsi2sd xmm0, eax ; int → double로 변환 → xmm0 하위 8바이트에 저장
mov eax, DWORD PTR [num2] ; 두 번째 int 값 불러오기
cvtsi2sd xmm1, eax ; int → double 변환 → xmm1 하위 8바이트에 저장
divsd xmm0, xmm1 ; double 나눗셈 수행: xmm0 = xmm0 / xmm1
movsd QWORD PTR [result], xmm0 ; 결과(double)를 메모리에 저장
num1, num2의 메모리 공간은 여전히 4바이트 (int)이다.xmm 레지스터에서 처리되며, 원래 변수의 공간은 바뀌지 않음.result만 8바이트 크기를 가진다 (double이기 때문).xmm0 = [ 0000000000000000 | 4014000000000000 ]
(상위 8바이트) (하위 8바이트: double 5.0)
| 항목 | 설명 |
|---|---|
int -> double | 연산 시점에서 해석만 바뀜, 메모리는 고정 |
xmm 레지스터 | 128비트, double 값은 하위 64비트 사용 |
| 형 변환 방식 | 명시적: (double), 암시적: 자동 처리 |
| 메모리 변경 여부 | 원래 변수는 4바이트 그대로 유지 |
| 어셈블리 변환 | cvtsi2sd, divsd 등 SSE 명령어 사용 |
cvtsi2sd: int를 double로 변환 (SSE2 명령어)divsd: double 나눗셈 (SSE2 명령어)xmm0 ~ xmm15: x86-64에서 부동소수점 / 벡터 연산용 레지스터