C 자료형
🌿 자라는 중
목차
자료형은 결국 “메모리 몇 바이트를 쓰느냐”고, 바이트 수가 곧 표현 범위다. 범위를 넘으면 오버플로우, 서로 다른 타입을 섞으면 함정 - 정처기 C 문제의 절반은 여기서 나온다.
크기 · 범위
| 분류 | 자료형 | 크기 | 범위 / 정밀도 |
|---|---|---|---|
| 정수 | char | 1 byte | −128 ~ 127 |
| 정수 | unsigned char | 1 byte | 0 ~ 255 |
| 정수 | short | 2 byte | −32,768 ~ 32,767 |
| 정수 | int | 4 byte | 약 −21억 ~ +21억 |
| 정수 | unsigned int | 4 byte | 0 ~ 약 42억 |
| 정수 | long | 4 또는 8 byte (환경 의존) | int 이상 |
| 실수 | float | 4 byte | 소수점 6~7자리 |
| 실수 | double | 8 byte | 소수점 15~16자리 |
외울 건 표가 아니라 공식이다. n비트일 때:
| 구분 | 범위 공식 |
|---|---|
| 부호 있음 | −2ⁿ⁻¹ ~ 2ⁿ⁻¹ − 1 |
| unsigned | 0 ~ 2ⁿ − 1 |
long은 환경에 따라 다르다 (Linux·macOS 64비트 = 8byte, Windows = 4byte). 시험은 long의 크기를 묻지 않으니 “int 이상”으로만 알면 된다.
char는 사실 정수형
char에는 문자가 아니라 그 문자의 아스키 코드(정수)가 저장된다. 같은 값을 %c로 보면 문자, %d로 보면 숫자.
char grade = 'A';
printf("%c %d", grade, grade); // A 65
'0'= 48,'A'= 65,'a'= 97 - 대소문자 차이는 32char ch = '7';→ 값은 55 (숫자 7이 아니다!). 숫자로 바꾸려면ch - '0'
오버플로우 = 256으로 나눈 나머지
1바이트(char)는 256을 넘는 순간 한 바퀴 돈다.
char c = 200; // -56 (200 - 256)
unsigned char u = 250 + 10; // 4 (260 - 256)
unsigned 함정 2개
함정 1 - unsigned에 −1을 넣으면 최댓값이 된다. 음수의 비트 패턴(전부 1)을 부호 없이 읽기 때문.
unsigned int x = -1;
printf("%u", x); // 4294967295 ← 최댓값
함정 2 - 비트 반전(~)은 타입의 비트 폭을 먼저 확인.
printf("%d", ~5); // -6 (int, 32비트)
unsigned char a = 5, b = ~a;
printf("%d", b); // 250 (8비트)
| 타입 | 비트 폭 | ~n |
|---|---|---|
int | 32비트 | −n − 1 |
| 8비트 unsigned | 8비트 | 255 − n |
실수형: float에는 오차가 있다
float f = 3.14f; printf("%.10f", f); // 3.1400001049 ← 오차
double d = 3.14; printf("%.10f", d); // 3.1400000000
C에서 3.14를 그냥 쓰면 기본 타입은 double. float로 쓰려면 3.14f.
리터럴 접미사
| 접미사 | 타입 | 예시 |
|---|---|---|
u / U | unsigned int | 5u |
l / L | long | 100L |
ul / UL | unsigned long | 5UL |
f / F | float | 3.14f |
| 없음 (정수) | int | 5 |
| 없음 (소수) | double | 3.14 |
접미사는 타입만 바꾼다. 값은 그대로 (5u의 값은 5).
정수 나눗셈: 버림이지 반올림이 아니다
int a = 7, b = 2;
printf("%d", a / b); // 3
printf("%.1f", (double)a / b); // 3.5
printf("%d", (int)3.99); // 3
printf("%d", (int)(-3.7)); // -3 ← 0 방향 버림
정수 ÷ 정수 = 정수 (버림). (int) 캐스팅도 반올림이 아니라 버림 - 음수는 0 쪽으로 버려서 -3.7이 -4가 아니라 -3이 된다.
정처기 포인트
- 함정 1:
char ch = '7';의 값을 7로 아는 선지 → 55. 숫자화는ch - '0'. - 함정 2:
unsigned int x = -1;→ 에러가 아니라 최댓값(4294967295). - 함정 3:
~5를 물으면 타입부터 - int면 −6, 8비트 unsigned면 250. - 함정 4:
(int)(-3.7)→ 반올림·내림이 아니라 0 방향 버림 = −3. - 함정 5: 소수 리터럴의 기본 타입은 float이 아니라 double.
한 줄: 범위는 2ⁿ 공식으로, char는 정수(아스키), 오버플로우는 mod 256, unsigned −1은 최댓값, 정수 나눗셈·캐스팅은 버림.