일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- regression problem
- coursera
- const
- #endif
- 본즈앤올
- 나동빈님
- 학습 알고리즘
- CLion
- 홍정모님
- Machine Learning
- Runtime constants
- 코드블럭 오류
- sizeof()
- algorithm
- #define
- 이코테
- 프로그래밍
- compile time constants
- 단항연산자
- Andrew Ng
- 기계학습
- classification problem
- standford University
- 코딩테스트
- C++
- Greedy
- 연산자
- 형변환
- 기계학습 기초
- decimal
- Today
- Total
wellcome_공부일기
02.03. C++ | 고정너비 정수(Fixed-width integers)란? 본문
<목차>
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)
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에서 고정너비 정수에 대한 이론을 참고하였습니다.
'프로그래밍 > C++' 카테고리의 다른 글
C++ | 02.05. 부동소수점 수(Floating Point Numbers) (0) | 2020.05.06 |
---|---|
02.04. C++ | 무치형(Void Data Types) = No Type! (0) | 2020.05.05 |
02.02. C++ | 정수형(Integer Data Types) (0) | 2020.05.03 |
02.01. C++ | 기본 자료형(Primitive Built-in Types)과 + α (0) | 2020.05.02 |
01.11. C++ | 변수 초기화 3가지 방법과 차이 (0) | 2020.04.30 |