📘 C 언어의 자료형 변환 (형변환 정리)
형변환은 크게 다음 두 가지로 나뉜다:
- 자동 형변환(암시적)
- 명시적 형변환(강제)
✅ 자동 형변환 (Implicit Casting)
컴파일러가 형이 다른 값들끼리의 연산 또는 대입에서 자동으로 자료형을 변환해주는 것을 의미한다.
🔸 대입 연산 시 자동 형변환
- 정수 → 실수: 실수의 표현 범위가 넓기 때문에 손실 없이 변환 가능 단, 부동소수점 오차는 존재할 수 있다.
- 실수 → 정수: 소수부가 잘림 (반올림 X)
- 큰 정수 → 작은 정수: 상위 바이트가 손실될 수 있다. (예: int → char 변환)
📌 float 값을 int에 대입할 때 주의점
- 소수점 이하가 절삭된다. (반올림 ❌)
- float는 큰 정수를 정확히 표현할 수 없다. (유효숫자 한계)
- float 값이 int의 표현 범위를 벗어나면 오버플로우가 발생한다.
🔸 정수 승격 (Integral Promotion)
작은 정수형(char, short 등)은 연산 전에 자동으로 int 또는 unsigned int로 승격된다.
short num1 = 15, num2 = 25;
short num3 = num1 + num2; // ⚠ num1과 num2는 int로 승격되어 연산됨
- 연산 결과는 int형이기 때문에, 컴파일러 경고가 발생할 수 있다.
🔸 피연산자 간 자료형 불일치에 의한 자동 형변환
두 피연산자의 자료형이 다를 경우, 데이터 손실을 최소화하는 방향으로 자동 변환된다.
변환 우선 순위 (손실 최소화 기준):
int → long → long long → float → double → long double
예시:
double num1 = 5.15 + 19; // 19는 int → double로 변환됨
🔹 참고: 상수의 형변환
const int a = 10;
double d = a; // ✅ 자동으로 double로 형 변환됨
const는 수정만 금지할 뿐, 형 변환은 허용된다.
✅ 명시적 형변환 (Explicit Casting)
프로그래머가 형변환 연산자를 활용해 강제로 자료형을 변환하는 방식이다.
🔸 예제: 실수 나눗셈 문제
int num1 = 3, num2 = 4;
double divResult;
divResult = num1 / num2;
printf("나눗셈 결과: %f\n", divResult);
💥 출력 결과:
나눗셈 결과: 0.000000
- num1 / num2는 int / int이므로 결과는 0 (정수 나눗셈)
- 0이 나중에 double로 변환되어 0.000000이 출력된다.
🔧 원하는 결과를 얻는 방법
divResult = (double)num1 / num2;
// 또는
divResult = num1 / (double)num2;
- 둘 중 하나를 double로 변환하면 나머지도 자동으로 double로 변환되어 실수 나눗셈 수행됨
- 결과: 0.75
✅ 마무리 요약
구분 | 설명 | 주의사항 |
자동 형변환 | 컴파일러가 자동으로 타입 변환 | 손실 가능성 있음 |
명시적 형변환 | (type)연산을 통해 프로그래머가 직접 변환 | 의미를 잘 이해하고 사용해야 함 |
정수 승격 | 작은 정수형 → int로 변환 | 연산에서 자주 발생 |
실수 연산 | 피연산자 하나만 실수여도 나머지도 변환 | 의도된 실수 연산은 명시적 변환을 추천 |
'프로그래밍 언어 > C' 카테고리의 다른 글
05. 함수 포인터 (Function pointer)와 void 포인터 (0) | 2025.06.27 |
---|---|
04. 포인터와 문자열 (2) | 2025.06.26 |
02. 상수(Constant) (0) | 2025.03.31 |
01. 실수 표현 (고정 소수점과 부동 소수점) (0) | 2025.03.31 |