02.05 - 고정된 너비 정수 (fixed-width integers)
C++은 정수 변수가 특정 최소 크기를 가질 것을 보장하고, 시스템에 따라서 크기가 더 커질 수 있다.
정수 변수의 크기가 고정되어 있지 않은 이유:
옛날, 성능이 가장 중요했던 C로 거슬러 올라가보자. 그때 C는 컴파일러가 대상 컴퓨터 아키텍처에서 가장 잘 작동하는 int의 크기를 선택할 수 있도록 의도적으로 정수의 크기를 열어 두는 것을 선택했다. 프로그래머로서, 대상 아키텍처에 따라 크기가 달라질 수 있는 변수를 다루는 것은 좀 터무니없는 일이다.
Fixed-width integers
크로스 플랫폼을 위해 C99에서는 모든 아키텍처에서 같은 크기를 갖도록 보장하는 고정 너비 정수(stdint.h)를 정의했다.
Name |
Type |
Range |
Notes |
int8_t |
1 byte signed |
-128 to 127 |
Treated like a signed char on many systems. See note below. |
uint8_t |
1 byte unsigned |
0 to 255 |
Treated like an unsigned char on many systems. See note below. |
int16_t |
2 byte signed |
-32,768 to 32,767 |
|
uint16_t |
2 byte unsigned |
0 to 65,535 |
|
int32_t |
4 byte signed |
-2,147,483,648 to 2,147,483,647 |
|
uint32_t |
4 byte unsigned |
0 to 4,294,967,295 |
|
int64_t |
8 byte signed |
-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
|
uint64_t |
8 byte unsigned |
0 to 18,446,744,073,709,551,615 |
C++는 공식적으로 이런 고정 너비 정수를 C++ 11의 일부로 채택했다. std 네임스페이스 내에 정의된 cstdint 헤더를 include하여 사용할 수 있다.
#include <iostream>
#include <cstdint>
int main()
{
std::int16_t i(5);
std::cout << i;
return 0;
}
boost 라이브러리(library)를 사용하는 경우, boost는 이러한 기능을 >의 일부로 제공한다.
Warning: int8_t과 uint8_t는 char처럼 동작할 수도 있고 동작하지 않을 수도 있다.
int8_t
와 uint8_t
는 각각 signed char
와 unsigned char
와 같이 동작할 수도 있지만 다르게 동작할 수도 있다.
#include <cstdint>
#include <iostream>
int main()
{
int8_t myint = 65;
std::cout << myint;
return 0;
}
대부분 시스템에서는 myint
를 char
자료형으로 처리하여 'A'를 출력하지만, 일부 시스템에서는 65를 출력할 수도 있다. 그러므로 int8_t
와 uint8_t
의 사용을 피하는 게 좋다.
이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/24a-fixed-width-integers/ 입니다.