C언어 형변환 개념정리

2025. 6. 17. 23:42·C/Concept

 

 

 

 

 

 

 

 

 

 

 

 

 

🌟 C언어 타입 캐스팅_정수형

더보기

들어가기 전에

  • C언어를 배우면서 타입 캐스팅(Type Casting)은 반드시 이해해야 하는 핵심 개념. 특히 16진수 데이터를 다룰 때 더욱 중요해지는데, 지금 실제 코드와 메모리 분석을 통해 타입 캐스팅의 원리를 알아보자

타입 캐스팅이란?

  • 하나의 데이터 타입을 다른 데이터 타입으로 변환하는 과정. 마치 물을 얼음으로 바꾸는 것처럼, 같은 데이터를 다른 형태로 해석하는 것.

캐스팅의 두 가지 방법

  • 암시적 캐스팅: 컴파일러가 자동으로 수행
  • 명시적 캐스팅: 프로그래머가 직접 지정

실습 코드 분석

#include <stdio.h>

void main()
{
    // 16진수 값을 int 타입 변수에 저장
    int iNum = 0x1a2b3c4d;
    printf("iNum 값: %x\n", iNum);
    
    // int를 char로 타입 캐스팅
    char cNum = (char)iNum;
    printf("cNum 값: %x\n", cNum);
}

 

① 코드 동작 원리

 ㉮ 1단계: 16진수 데이터 저장

  • 0x1a2b3c4d는 16진수 표기법으로, 10진수로는 439,041,101
  • 이 값이 int 타입 변수 iNum에 저장

 ㉯ 2단계: 타입 캐스팅 수행

  • (char)iNum은 명시적 캐스팅으로, int 타입을 char 타입으로 변환
  • 중요한 점은 데이터 손실이 발생한다는 것!

 

② 메모리 구조 분석

 ㉮ 데이터 타입별 크기

  • int: 4바이트 (32비트)
  • char: 1바이트 (8비트)

 ㉯ 메모리 레이아웃

// 원본 데이터 (iNum = 0x1a2b3c4d)

메모리 주소: 0x00000000 (예시)
+--------+--------+--------+--------+
|   1a   |   2b   |   3c   |   4d   |
+--------+--------+--------+--------+
 바이트3   바이트2   바이트1   바이트0
 
 // 캐스팅 후 (cNum = (char)iNum)
 
 char는 1바이트만 사용하므로 최하위 바이트만 유지
+--------+
|   4d   |  ← 0x4d만 남음
+--------+

 

③ 실행 결과 해석

이미지의 실행 결과를 보면:

  • iNum 값: 1a2b3c4d (전체 32비트 값)
  • cNum 값: 4d (최하위 8비트만 유지)

이것이 바로 데이터 절삭(Data Truncation)의 결과.

  

④ 메모리 덤프 분석

  ㉮ 메모리 주소별 데이터

 

  • 0x00001F16: 01 01 01 01 01 01 01 01
  • 0x00001F17: 00 01 00 00 00 00 00 01
  • 0x00001F18: 00 00 01 01 01 01 00 00

  ㉯ 16진수 값 확인

  • 16진수 0x1a2b3c4d의 10진수 변환값
  • 1a(26) × 16³ + 2b(43) × 16² + 3c(60) × 16¹ + 4d(77) × 16⁰ = 439,041,101

⑤ 정리

  ㉮ 엔디안

  • 리틀 엔디안: 최하위 바이트가 먼저 저장 (대부분의 x86 시스템)
  • 빅 엔디안: 최상위 바이트가 먼저 저장

  ㉯ 데이터 손실 주의사항 < 큰 데이터 타입에서 작은 데이터 타입으로 캐스팅할 때 >

  • 상위 비트들이 잘려나감
  • 원본 데이터 복구 불가능
  • 예상치 못한 결과 발생 가능

  ㉰ 기억할 점:

  • 큰 타입 → 작은 타입: 데이터 손실 발생
  • 작은 타입 → 큰 타입: 일반적으로 안전
  • 항상 캐스팅 결과를 예상하고 테스트하기
  • 메모리 덤프를 통한 디버깅 활용하기

⑥ 요약

  • 원본 데이터: 0x1a2b3c4d (4바이트 int)
  • 캐스팅 결과: 0x4d (1바이트 char)
  • 원리: char는 1바이트만 저장할 수 있어서 최하위 바이트(4d)만 남고 나머지는 잘려나감

 

 

 

🌟 내가 기억하려고 적는 4d만 출력되는 이유

더보기

💻 데이터 크기 차이

  • int: 4바이트 (32비트) - 1a 2b 3c 4d 전체 저장 가능
  • char: 1바이트 (8비트) - 한 바이트만 저장 가능

 

🖨️ 캐스팅 과정

원본 int 데이터: 0x1a2b3c4d
┌────┬────┬────┬────┐
│ 1a │ 2b │ 3c │ 4d │
└────┴────┴────┴────┘
 상위               하위

char로 캐스팅 시 ↓

        ┌────┐
        │ 4d │ ← 최하위 바이트만 남음
        └────┘

 

❓ 왜 최하위 바이트일까

  • 컴퓨터는 리틀 엔디안 방식으로 데이터를 저장
  • 메모리 주소가 낮은 곳에 최하위 바이트(4d)를 먼저 저장
  • char로 캐스팅할 때 메모리의 첫 번째 바이트만 읽어옴
  • 결론적으로 1a, 2b, 3c는 모두 사라지고 4d만 남아서 출력되는 것.

 

 

 

 

 

 

 

 

 

 

 

 

 

미리보기용

'C > Concept' 카테고리의 다른 글

C언어 포인터 개념정리_2  (0) 2025.06.16
C언어 포인터 개념정리_1  (3) 2025.06.13
C언어 소스코드 개념정리  (2) 2025.06.11
'C/Concept' 카테고리의 다른 글
  • C언어 포인터 개념정리_2
  • C언어 포인터 개념정리_1
  • C언어 소스코드 개념정리
eull
eull
eull 님의 블로그 입니다.
  • eull
    eull 님의 블로그
    eull
  • 전체
    오늘
    어제
    • 개발 환경 (31)
      • MYSQL_Workbench (1)
        • setting (1)
      • Linux_Ubuntu (2)
        • Task (1)
        • Setting (1)
      • C (19)
        • Concept (4)
        • Task (8)
        • Project (1)
        • Study (5)
        • Setting (1)
      • C++ (1)
        • Study (0)
        • Concept (1)
      • Python (6)
        • Task (4)
        • Project (2)
      • 일상 (1)
      • Setting (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
eull
C언어 형변환 개념정리
상단으로

티스토리툴바