변환의 함정
오버플로와 잘림을 다룹니다
변환의 함정은(는) CoddyKit의 무료 C Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
변환에는 함정이 있습니다
자동으로 일어나는 변환은 편리하지만 오버플로, 절삭, 부호와 관련된 뜻밖의 결과를 일으킬 수 있습니다. 이 단원에서는 이러한 함정을 다룹니다.
#include <stdio.h>
int main(void) {
printf("Beware silent conversions\n");
return 0;
}정수 오버플로
대상 정수 자료형에 비해 너무 큰 값을 대입하면 값이 순환하거나 데이터가 손실됩니다.
#include <stdio.h>
#include <limits.h>
int main(void) {
int max = INT_MAX;
printf("INT_MAX = %d\n", max);
return 0;
}좁은 자료형으로 변환할 때의 절삭
큰 값을 더 작은 자료형에 넣으면 하위 비트만 남아 숫자가 조용히 손상됩니다.
#include <stdio.h>
int main(void) {
int big = 300;
unsigned char small = (unsigned char)big;
printf("small = %d\n", small);
return 0;
}부호 있는 값과 부호 없는 값 섞기
부호 있는 값과 부호 없는 값을 섞으면 부호 있는 값이 부호 없는 값으로 변환되어 음수가 매우 큰 양수로 바뀝니다.
#include <stdio.h>
int main(void) {
int a = -1;
unsigned int b = 1;
if (a > b)
printf("surprise: -1 > 1 as unsigned\n");
return 0;
}반복문 카운터의 함정
0 아래로 내려가는 unsigned 반복문 카운터는 순환하여 매우 큰 값이 되므로 무한 반복이 발생합니다. 감소하며 셀 때는 부호 있는 카운터를 사용하세요.
#include <stdio.h>
int main(void) {
for (int i = 3; i >= 0; i--)
printf("%d ", i);
printf("\n");
return 0;
}float에서 int로 변환할 때의 손실
float을 int로 변환하면 소수 부분이 손실됩니다. 값이 int의 범위를 초과하면 결과는 정의되지 않습니다.
#include <stdio.h>
int main(void) {
double d = 3.99;
int n = (int)d;
printf("n = %d\n", n);
return 0;
}double에서 float으로 변환할 때의 정밀도 손실
정밀도가 높은 double을 float에 저장하면 자릿수가 줄어들며, 이러한 손실은 긴 계산에서 누적될 수 있습니다.
#include <stdio.h>
int main(void) {
double d = 1.123456789012345;
float f = (float)d;
printf("%.7f\n", f);
return 0;
}char의 부호와 관련된 뜻밖의 결과
char에 부호가 있는지는 구현에 따라 달라집니다. 음수 결과를 피하려면 바이트 값에 unsigned char를 사용하세요.
#include <stdio.h>
int main(void) {
unsigned char b = 200;
printf("b = %d\n", b);
return 0;
}나눈 다음 변환하기
정수 나눗셈을 먼저 수행한 다음 형변환해도 손실된 소수 부분은 복구할 수 없습니다. 나누기 전에 형변환하세요.
#include <stdio.h>
int main(void) {
int a = 7, b = 2;
double wrong = (double)(a / b);
double right = (double)a / b;
printf("%.1f vs %.1f\n", wrong, right);
return 0;
}자료형의 크기 비교
값이 들어간다고 가정하기 전에 limits.h의 상수를 사용해 자료형이 저장할 수 있는 범위를 확인하세요.
#include <stdio.h>
#include <limits.h>
int main(void) {
printf("char range: %d to %d\n", CHAR_MIN, CHAR_MAX);
return 0;
}방어적 변환
자료형을 좁히기 전에 범위를 확인하고, 확실하지 않을 때는 더 넓은 자료형을 우선 사용하며, 의도가 분명해지도록 형변환을 명시적으로 작성하세요.
#include <stdio.h>
int main(void) {
long value = 200;
if (value >= 0 && value <= 255)
printf("fits in a byte: %ld\n", value);
return 0;
}빠른 확인
변환의 함정에 대한 이해도를 확인해 보세요.
복습: 변환의 함정
자동으로 일어나는 변환의 위험성을 배웠습니다.
- 자료형을 좁히면 오버플로가 발생하거나 값이 절삭될 수 있습니다
- 부호 있는 값과 부호 없는 값을 섞으면 비교 결과가 뒤집힙니다
- 부호 없는 카운터는 0 아래에서 순환합니다
- 소수 부분을 유지하려면 나누기 전에 형변환하세요
- 범위를 확인하고 형변환을 명시적으로 작성하세요
자주 묻는 질문
“변환의 함정” 강의는 무료인가요?
네 — “변환의 함정” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C Academy 강의 전체를 잠금 해제할 수 있습니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“변환의 함정”에서 뭘 배우나요?
오버플로와 잘림을 다룹니다 브라우저에서 직접 실행하는 실습 코드로 C Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“변환의 함정” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.