🌟 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 |