C 자료형 레퍼런스

모든 기본 C 자료형과 stdint.h 고정폭 타입의 크기, 부호있는/없는 범위, printf 포맷 지정자를 확인하세요. int·long·포인터 크기는 플랫폼마다 다르기 때문에 플랫폼 선택 기능도 있습니다.

타입 크기·범위 표

char와 short는 사실상 모든 최신 플랫폼에서 각각 1바이트, 2바이트입니다. int, long, long long, 포인터 크기 타입은 데이터 모델에 따라 달라지는데, 이 선택 기능이 보여주는 게 바로 그 차이입니다.

기본 타입

타입 바이트 최소값 최대값 printf

stdint.h 고정폭 타입

타입 바이트 최소값 최대값 printf

*scanf는 double에 %lf가 필요합니다. printf는 float 인자가 가변인자에서 자동으로 double로 승격되기 때문에 float·double 둘 다 %f로 처리됩니다. PRId8/16/32/64, PRIu8/16/32/64는 이식성 있는 매크로이며, 표에 보이는 % 지정자는 선택한 플랫폼에서 해당 매크로가 실제로 전개되는 형태입니다.

int와 long 크기가 플랫폼마다 다른 이유

C 표준은 각 타입의 최소 범위만 보장할 뿐 정확한 크기를 정하지 않으므로, 컴파일러는 그 최소치만 만족하면 int와 long을 원하는 만큼 크게 만들어도 됩니다. Linux와 macOS는 64비트 시스템에서 long을 64비트로 만들었지만(LP64), Windows는 호환성 때문에 long을 32비트로 유지하고 long long과 포인터만 확장했습니다(LLP64). 그래서 똑같은 C 소스코드도 플랫폼별로 컴파일하면 다르게 동작할 수 있습니다.

stdint.h가 존재하는 이유

int32_t, uint64_t 같은 고정폭 타입은 모든 표준 준수 플랫폼에서 정확한 비트 폭을 보장해서 int/long의 모호함을 아예 없애줍니다. 패킷 필드나 레지스터 값처럼 특정 크기가 필요한 코드는 이식성이 중요할 때 plain int나 long 대신 이런 타입을 써야 합니다.

알아두면 좋은 함정: char는 부호가 있을까 없을까

여기 나온 다른 정수 타입과 달리 plain char의 부호 유무는 구현별로 정의됩니다. x86에서는 흔히 부호 있음이지만 많은 ARM 툴체인에서는 기본적으로 부호 없음이라서, 코드가 char를 signed char처럼 동작한다고 가정하면 가끔 실제 버그로 나타납니다. 부호가 중요하다면 항상 signed char나 unsigned char를 명시적으로 쓰세요.

FAQ

long 변수가 Windows와 Linux에서 다르게 동작하는 이유는 무엇인가요?

64비트 Windows는 long이 32비트로 유지되는 LLP64 데이터 모델을 쓰고, 64비트 Linux·macOS는 long이 64비트인 LP64를 씁니다. long이 항상 포인터 크기와 같거나 항상 64비트 값을 담을 수 있다고 가정하는 코드는 Windows에서 오동작합니다.

부호 없는 32비트 정수의 실제 범위는 무엇인가요?

0부터 4,294,967,295까지입니다. 이는 비트 폭에만 의존하는 고정값이라 플랫폼과 무관하며, plain unsigned int의 크기는 기술적으로 플랫폼에 따라 다르지만 uint32_t는 어디서나 동일하게 정의되는 이유이기도 합니다.

새 코드에서는 int를 써야 하나요, int32_t를 써야 하나요?

파일 포맷, 네트워크 프로토콜, 하드웨어 레지스터처럼 정확한 크기가 중요할 때는 int32_t(또는 다른 stdint.h 고정폭 타입)를 쓰세요. 정확한 폭이 상관없는 일반적인 루프 카운터나 작은 값에는 plain int로 충분합니다.

printf가 float와 double 둘 다에 %f를 쓰는 이유는 무엇인가요?

C의 가변인자 함수는 float 인자를 자동으로 double로 승격시키기 때문에, printf가 인자를 읽을 때는 변수의 선언 타입과 무관하게 항상 double이고 %f가 이를 올바르게 처리합니다. scanf는 포인터 인자를 승격시키지 않으므로 float*에는 %f, double*에는 %lf가 필요합니다.

size_t와 ptrdiff_t의 차이는 무엇인가요?

size_t는 부호 없는 타입으로 객체 크기나 배열 인덱스를 나타내며 절대 음수가 될 수 없습니다. ptrdiff_t는 부호 있는 타입으로 두 포인터의 차이를 나타내며, 앞선 포인터에서 뒤 포인터를 빼면 음수가 될 수 있습니다.

관련 도구