gyumin.log

C 자료형

🌿 자라는 중

목차

자료형은 결국 “메모리 몇 바이트를 쓰느냐”고, 바이트 수가 곧 표현 범위다. 범위를 넘으면 오버플로우, 서로 다른 타입을 섞으면 함정 - 정처기 C 문제의 절반은 여기서 나온다.

크기 · 범위

분류자료형크기범위 / 정밀도
정수char1 byte−128 ~ 127
정수unsigned char1 byte0 ~ 255
정수short2 byte−32,768 ~ 32,767
정수int4 byte약 −21억 ~ +21억
정수unsigned int4 byte0 ~ 약 42억
정수long4 또는 8 byte (환경 의존)int 이상
실수float4 byte소수점 6~7자리
실수double8 byte소수점 15~16자리

외울 건 표가 아니라 공식이다. n비트일 때:

구분범위 공식
부호 있음−2ⁿ⁻¹ ~ 2ⁿ⁻¹ − 1
unsigned0 ~ 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 - 대소문자 차이는 32
  • char 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
int32비트−n − 1
8비트 unsigned8비트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 / Uunsigned int5u
l / Llong100L
ul / ULunsigned long5UL
f / Ffloat3.14f
없음 (정수)int5
없음 (소수)double3.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은 최댓값, 정수 나눗셈·캐스팅은 버림.

연결되는 것들

  • 초기화 안 한 변수에 뭐가 들어 있는지, 언어별 기본값 → 변수 초기화
  • 같은 비트를 %d·%x·%c로 다르게 읽는 이야기 → C 출력 함수