소년코딩

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); // direct initialization
    std::cout << i;
    return 0;
}

boost 라이브러리(library)를 사용하는 경우, boost는 이러한 기능을 >의 일부로 제공한다.


Warning: int8_t과 uint8_t는 char처럼 동작할 수도 있고 동작하지 않을 수도 있다.

int8_tuint8_t는 각각 signed charunsigned char 와 같이 동작할 수도 있지만 다르게 동작할 수도 있다.

#include <cstdint>
#include <iostream>

int main()
{
    int8_t myint = 65;
    std::cout << myint;

    return 0;
}

// 'A' or 65

대부분 시스템에서는 myintchar 자료형으로 처리하여 'A'를 출력하지만, 일부 시스템에서는 65를 출력할 수도 있다. 그러므로 int8_tuint8_t의 사용을 피하는 게 좋다.


cpp 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/24a-fixed-width-integers/ 입니다.

댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기