Quick Reference
C 일반 계산은 int, 일반 실수 계산은 double에서 시작합니다. byte 폭·부호가 외부 계약이면 <stdint.h>의 고정 폭 타입을 쓰고, 바뀌지 않는 기준값은 const로 표시합니다.
#include <stdbool.h>
#include <stdint.h>
int count = 100;
double ratio = 3.1415926535;
bool ready = false;
/* 파일 형식·프로토콜처럼 폭이 계약일 때만 고정 폭 타입을 고른다. */
const int max_size = 256;
uint32_t flags = 0x000000FF;일반 계산은 int와 double로 시작하고, bool은 상태를 드러낼 때 씁니다. uint32_t처럼 폭을 이름에 적은 타입은 해당 폭이 외부와 약속된 경우에만 고릅니다.
문법
C에서 자주 다시 보는 기본 타입은 보통 아래처럼 나뉩니다.
- 문자와 작은 코드 단위:
char - 일반 정수 계산:
int - 더 작은/큰 정수 폭:
short,long,long long - 일반 실수 계산:
double - 더 작은 실수 포맷:
float - 참/거짓:
_Bool또는bool - 크기와 부호가 계약인 값:
int16_t,uint32_t같은 고정 폭 타입
char grade = 'A';
int count = 100;
long long total_bytes = 9000000000LL;
double average = 92.75;
float sensor_value = 12.5f;
const int max_size = 256;
const double retry_interval = 0.25;
uint32_t flags = 0x000000FF;
int16_t temperature = -12;
uint8_t alpha = 255;bool, uint32_t, int16_t는 각각 <stdbool.h>, <stdint.h>가 필요합니다. int32_t처럼 폭이 정확히 고정된 이름은 그 폭을 제공하는 구현에서만 정의되고, 단지 최소 폭만 필요하면 int_least32_t 계열이 더 맞을 수 있습니다.
기본 감각은 이렇습니다.
- 일반 정수 계산은
int - 일반 실수 계산은
double - 바뀌지 않을 기준값은
const - 바이트 수와 부호가 의미를 바꾸는 데이터는 고정 폭 타입
int count = 10;
uint32_t packet_length = 10;겉보기 값은 같아도 의미는 다릅니다. count는 계산용 정수에 가깝고, packet_length는 바이트 수가 계약인 값에 가깝습니다.
char의 signed 여부는 구현마다 다릅니다. 바이트 값이나 문자 분류 함수의 입력을 다룰 때는 char를 음수 값으로 가정하지 말고 필요하면 unsigned char로 변환합니다. 또한 char 배열의 길이는 UTF-8 텍스트의 글자 수가 아니라 바이트 수입니다.
선택 기준
int는 일반 계산의 기본값으로 좋지만, 크기를 고정해 주지는 않습니다.
size_t int_size = sizeof(int);
size_t long_size = sizeof(long);
size_t double_size = sizeof(double);그래서 파일 포맷, 패킷, 하드웨어 레지스터처럼 바이트 수 자체가 계약이면 stdint.h 타입을 먼저 보는 편이 맞습니다.
double은 일반 실수 계산의 기본값이고, float는 32비트 포맷이 이미 정해진 버퍼나 프로토콜에 더 잘 맞습니다.
double average = 12.5 / 4;
float sample = 12.5f / 4.0f;const는 "이 값은 계산 중간값이 아니라 기준값"이라는 신호에 가깝습니다.
const int max_size = 256;
const double retry_interval = 0.25;char와 bool도 기본 타입 카드에서 빠지면 안 됩니다. char는 문자 하나를 담는 데 자주 쓰지만 결국 작은 정수 타입이기도 하고, bool은 조건 상태를 더 명시적으로 보여 주는 데 유용합니다.
char grade = 'A';
bool ready = true;float와 double도 "더 작다/더 크다"보다 "이미 포맷이 정해졌는가"로 나누는 편이 빠릅니다.
double average = 12.5 / 4;
float stored = 12.5f;계산 기본값은 double이고, 저장 포맷이나 외부 버퍼가 32비트로 이미 정해진 경우에 float가 자연스럽습니다.
주의할 점
unsigned는 범위를 넓혀 주는 대신 signed와 섞이는 순간 더 위험해질 수 있습니다.
int n = -1;
unsigned int u = 1;
if (n < u) {
/* 기대와 다르게 동작할 수 있음 */
}- signed와 unsigned가 만나면 암묵적 변환 때문에
-1이 매우 큰 양수처럼 해석될 수 있습니다. - 음수와 크기 값을 같은 비교식에 섞기보다, 음수 여부를 먼저 확인한 뒤 같은 부호의 타입으로 비교합니다.
- 일반 계산값과 반복 횟수는
unsigned를 습관적으로 늘리기보다int로 두는 편이 안전합니다. - 타입 크기는 외우지 말고
sizeof로 확인합니다. - 파일 포맷, 패킷, 하드웨어 값은 기본 타입보다 고정 폭 타입을 먼저 생각하는 편이 맞습니다.
참고 링크
3 sources