int
32bit 컴퓨터 기준으로 정수가 32bit (4byte) 크기라고 가정한다면 int 자료형은 2의 32제곱의 값(4,294,967,296)을 표현할 수 있다.
음수, 0, 양수를 포함하여 최소 -2,147,483,648에서 최대 2,147,483,647까지 표현하는 것이다.
- ex. 쥬니어네이버 동물농장 포인트는 21억이 최대였다.
- ex. 마인크래프트 레벨은 21억이 최대다.
unsigned int
unsigned int 자료형은 int의 범위를 양의 정수 범위로만 사용한 자료형이다.
따라서 양의 표현이 2배 늘어난다. 최소 0부터 최대 4,294,967,295까지 표현한다.
- ex. 바람의 나라 최대 경험치는 42.9억이다.
size_t
size_t는 a.k.a. 'long unsigned int'(별칭)로서 '이론상 가장 큰 사이즈를 담을 수 있는 unsigned 데이터 타입'으로 정의된다.
해당 시스템에서 최대 크기의 데이터를 표현하는 타입으로서 반드시 unsigned 형으로 나타낸다.
즉, 32bit 머신에서는 32bit 사이즈의 unsigned 정수형,
64bit 머신에서는 64bit 사이즈의 unsigned 정수형(unsigned long long)이다.
향후 등장할지도 모르는 128bit 머신이라던가 더 큰 머신이 존재한다면 그에 따라 더 큰 사이즈가 되겠다.
unistd.h 헤더에서는 _size_t.h가 정의되어 있는데, 이 _size_t.h에서는 아래를 정의하고 있다.
# unistd.h
typedef __darwin_size_t size_t;
또는 stdlib.h에도 size_t가 define 되어있다.
- ex. strlen 함수의 리턴값의 자료형은 size_t 다.
size_t형 변수를 printf를 사용하여 출력할 시 %ld 혹은 %zu로 포맷팅하여 출력한다.
decimal specifier인 %d로 포맷팅할 시 size_t는 aka long unsigned int이니 %ld, %zu를 사용하라는 안내문이 나온다. (Ubuntu 18.04 LTS, gcc(clang) 환경 기준)
컴파일러에 따라 권유하는 printf의 length, specifier는 다르다. (printf의 format tag란)
u 와 d 같은 specifier는 대응하는 인자를 어떠한 형태로 표현할지를 결정한다.
l 과 z 같은 length는 출력하는 데이터의 크기를 지정하는데 사용된다.
int, unsigned int, size_t의 크기를 출력해보면 다음과 같다.
실행결과는 환경마다 다를 수 있다.
#include <stdio.h>
int main(void)
{
printf("size of size_t : %lu\n", sizeof(size_t));
printf("size of unsigned int : %lu\n", sizeof(unsigned int));
printf("size of int : %lu\n", sizeof(int));
}
// 실행 결과 (byte 기준)
size of size_t : 8
size of unsigned int : 4
size of int : 4
주의할 점은 int는 32bit 컴퓨터 기준으로 32bit(4byte) 크기로 설명이 많이 되지만 환경에 따라 크기가 가변적이라는 것이다.
최소 16bit (2byte)이며, 오래된 PC나 임베디드 환경에서는 16bit인 경우가 얼마든지 있을 수 있다.
특히 64bit OS로 많이 전환된 지금은 64bit (8byte)인 경우도 대다수일 것이다.
unsigned int 와 size_t도 최소값만 정해져 있을 뿐 크기는 고정되어 있지 않다.
출처
Microsoft 데이터 형식 범위, docs.microsoft.com/ko-kr/cpp/cpp/data-type-ranges?view=vs-2019
"int대신 size_t를 쓰는 이유(펌)"의 댓글 항목들 (본문은 오류가 있음), egloos.zum.com/lechocolat/v/343748
해시코드 답변, "size_t는 정확히 어떤 타입인가요?", hashcode.co.kr/questions/754/size_t%EB%8A%94-%EC%A0%95%ED%99%95%ED%9E%88-%EC%96%B4%EB%96%A4-%ED%83%80%EC%9E%85%EC%9D%B8%EA%B0%80%EC%9A%94
'Code > C' 카테고리의 다른 글
[C언어] 내장함수 비교 - memcpy, memccpy / memmove / memchr / memcmp (0) | 2020.10.08 |
---|---|
[C언어] 내장함수 비교 - strchr, strrchr / strstr, strnstr / strcmp, strncmp (0) | 2020.10.08 |
[C언어] 내장함수 비교 - strdup, malloc, calloc, free (2) | 2020.10.07 |
[C언어] NULL, 0, NUL, '\0', undefined의 차이 (0) | 2020.10.06 |
[C언어] 내장함수 비교 - memset, bzero (0) | 2020.10.06 |
댓글