C언어에서 형 변환 좀 더 살펴보기

낚시하는 곰·2025년 4월 11일

krafton jungle

목록 보기
50/52

개요

이 문서는 C 언어에서 int 형 값을 double 형으로 변환할 때 내부적으로 어떤 일이 벌어지는지를 정리한 것이다.


사용자 질문 요약

  1. double result = (double)num1 / num2;일 때, num1만 double로 형변환했는데, num2는 언제 double이 되는가?
  2. (double)num1처럼 명시적으로 변환하면 메모리 공간이 4바이트에서 8바이트로 확장되는가?
  3. xmm0, xmm1에 저장된다는 게 무슨 의미이고, 레지스터 크기는 얼마인가?
  4. 형변환된 값은 4바이트로 저장되는가 8바이트로 저장되는가?
  5. 형변환 과정에서 num1, num2의 메모리 크기도 8바이트로 바뀌는가?

결론 요약

C 언어에서 int를double로 형변환하면, 값만 일시적으로 8바이트 double로 해석되며, 원래 변수의 메모리 크기는 변하지 않는다.


핵심 내용 요약

1. 명시적 형 변환의 의미

  • (double)num1은 num1의 값을 double로 해석하라는 지시이지, 실제 메모리를 8바이트로 바꾸는 것이 아님.
  • 메모리의 크기는 int 타입 선언 시점에 이미 4바이트로 고정되어 있다.

2. 산술 연산 시 형변환

  • (double)num1이 연산에 사용되면, num2는 자동으로 double로 변환됨 (암시적 형 변환).
  • 따라서 결과는 두 double 값 간의 나눗셈으로 처리된다.

3. 어셈블리 레벨의 처리

  • cvtsi2sd xmm0, eax 명령어를 사용해 int 값을 double로 변환하여 xmm0에 저장.
  • xmm 레지스터는 128비트(16바이트) 크기이며, double 하나는 하위 8바이트에 저장됨.
  • 연산은 divsd xmm0, xmm1 등 SSE 명령어로 처리됨.
어셈블리 코드 예시 (x86-64 기준)
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)를 메모리에 저장

4. 메모리 확장 여부

  • num1, num2의 메모리 공간은 여전히 4바이트 (int)이다.
  • double로 변환된 값은 일시적으로 xmm 레지스터에서 처리되며, 원래 변수의 공간은 바뀌지 않음.
  • 결과 변수인 result만 8바이트 크기를 가진다 (double이기 때문).

5. 시각화 예시 (xmm0 레지스터 상태)

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에서 부동소수점 / 벡터 연산용 레지스터

profile
취업 준비생 낚곰입니다!! 반갑습니다!!

0개의 댓글