wellcome_공부일기

02.03. C++ | 고정너비 정수(Fixed-width integers)란? 본문

프로그래밍/C++

02.03. C++ | 고정너비 정수(Fixed-width integers)란?

ma_heroine 2020. 5. 4. 06:58

<목차>

1. 고정너비 정수(Fixed-width integers)의 탄생 배경

2. 고정너비 정수(Fixed-width integers) 

3.빠른 정수와 최소 정수(Fast and least integers)

4. size_t란?(To be continued)

 

 

고정너비 정수(Fixed-width integers)의 탄생 배경

- 정수 자료형은 왜 고정된 크기를 갖지 않는가?

(https://heroine-day.tistory.com/16)에서 자료형 테이블 확인해보면 int형만 사이즈가 다양하다는 걸 확인할 수 있습니다. ٩(ˊᗜˋ*)و 

간단하게 설명하자면, 컴퓨터가 느리고 성능이 가장 중요했던 C로 거슬러 올라갑니다. C는 컴파일러 구현자가 대상 컴퓨터 아키텍처에서 가장 성능이 좋은 int의 크기를 선택할 수 있도록 의도적으로 정수의 크기를 열어 두기로 선택했습니다.

 

하지만, 현대의 기준으로 보면 고정된 크기의 정수는 별로일 수 밖에 없습니다. 프로그래머로서, 범위가 불확실한 유형을 다루어야 한다는 것은 좀 우스꽝스러울 수 있습니다. 또한 최소 보장 범위 이상을 사용하는 프로그램은 한 아키텍처에서는 작동할 수 있지만 다른 아키텍처에서는 작동하지 않을 수 있습니다.

 

 

 

고정너비 정수(Fixed-width integers)

www.learcpp.com

 C++는 이 고정 너비 정수를 C++11의 일부로 공식적으로 채택했고, cstdint 헤더를 포함하여 접근할 수 있습니다.

#include <iostream>
#include <cstdint>
 
int main()
{
    using namespace std;
    
    std :: int16_t i{5};
    std :: int8_t myint = 65; 
    
    cout << i << endl; //output: 5
    cout << myint << endl; //output: A
    
    return 0;
}

- 고정너비 정수는 std 네임스페이스 내부에 정의됩니다. 

- 16비트 크기의 정수형(2바이트)에 5를 저장하였습니다.

- 8비트를 크기의 정수형(1바이트)에 65를 저장하였고,  아스키 코드 테이블에 따라 A가 출력됩니다.

- 1바이트는 char과 동일하게 작은 크기를 가지고 있어 오류가 발생할 수 있습니다.

- 1바이트에 정수를 저장하는 건, C++에서는 oversight의 우려로 보아서 signed char(혹은 unsigned char)로 정의하고 다룹니다.

- 하지만 어떤 os에서는 65를 출력할 수 있습니다. 이러한 모호함을 피하기 위해 int8_t는 사용을 자제해야 합니다.

- 대신int_fast16_t을 사용하면 됩니다!  (づ。◕‿‿◕。)づ 

 

- 고정너비 정수(Fixed-width integers) 단점

고정 너비 정수는 두 개의 단점을 가집니다. 첫째로, 고정 너비 정수는 선택사항이고 설정한 폭과 일치하는 기본적인 유형이 있고 특정한 이진 표현을 따르는 경우에만 존재합니다. 고정 너비 정수를 사용하면 코드의 이동성이 떨어지며, 다른 시스템에서는 컴파일되지 않을 수 있다.
둘째, 고정 너비 정수를 사용하는 경우, 일부 아키텍처에서는 더 넓은 유형보다 느릴 수도 있습니다. -10 ~ 20 사이의 값을 고정하기 위해 정수가 필요한 경우 std::int8_t를 사용하려고 할 수 있습니다. 하지만 당신의 CPU는 32비트 와이드 정수를 처리하는데 더 능숙할 수 있으므로, 단지 그것을 제한함으로써 속도를 줄였을 뿐입니다.

 

 

 

빠른 정수와 최소 정수(Fast and least integers)

위의 단점을 다루기 위해 C++는 두 개의 대체 정수를 정의하기도 합니다. 
The fast type(std:int_fast#_t)은 최소 비트(여기서 # = 8, 16, 32 또는 64)의 너비로 가장 빠른 signed integer 유형을 제공합니다.

예를 들어, std:int_fast32_t는 최소 32비트인 가장 빠른 signed integer 유형을 제공합니다.
The least type (std:int_least#_t)은 최소 #비트(여기서 # = 8, 16, 32 또는 64)의 너비로 가장 작은 signed integer 유형을 제공합니다.

예를 들어, std:int_least32_t는 최소 32비트인 가장 작은 signed integer 유형을 제공합니다.

#include <iostream>
#include <cstdint>

using namespace std;

int main()
{
    std :: int_fast8_t fi(5);
    std :: int_least64_t fl(5);

    cout << fi << endl; //output : 공백
    cout << fl << endl; //output : 5

    return 0;
}

- 8비트인 1바이트에 정수를 저장하는 것은 크기가 맞지 않아 공백이 출력됩니다.

- 64비트인 8바이트에 정수를 저장할 수 있어 5가 출력됩니다. 

- 정수가 적어도 특정 최소 크기를 보장해야만 할 때 std::int_fast#_t and std::int_least#_t를 사용하면 됩니다.

- uint_fast#_t와 uint_least#_t도 존재합니다.(unsigned version)

 

정확히 언제 사용하는지에 대한 예도 곧 업데이트 하겠습니다!

 

 

 

 

 

 

 

 

* 해당 글은 홍정모님의 따라 배우는 C++을 공부한 토대로 작성되었습니다.

* 해당 글은 www.learncpp.com에서 고정너비 정수에 대한 이론을 참고하였습니다.

Comments