[C++] Fundamental types

신선한양배추·2022년 1월 16일
0
post-thumbnail

이 글은 int, short, long, char 같은 Fundamental Type에 대해 정리한 글이다. 64비트 OS 대상으로 핵심 요소만 정리해보겠다.

데이터 모델

데이터 모델에 따라 타입의 비트수가 달라진다. 그리고 데이터모델은 '컴파일러가 구동을 목표로 삼은 OS'에 따라 달라진다. 알아둬야될 사항은 다음과 같다.

윈도우 64비트는 LLP64를 사용하고 리눅스 64비트는 LP64를 사용한다.

Long타입의 크기가 LLP64는 32비트고 LP64는 64비트이다.

이정도가 되겠다. 다른 타입에 대해서는 흔히 아는대로다.

그래서 이게 무슨 영향이 있는가? 백문이 불여일견, 직접 테스트해보았다.
아래 코드를 powershell 과 wsl(리눅스)에서 테스트해보았다.

#include<bits/stdc++.h>

int main(){
  std::cout << sizeof(int)<<'\n';
  std::cout << sizeof(long) << '\n';
  std::cout << sizeof(long long) << '\n';
}

예시

powershell

4
4
8

./a.exe를 실행했더니 두번째줄에 있는 long타입이 4바이트라는걸 알수있다.

wsl

4
8
8

./a.out를 실행했더니 두번째줄에 있던 long타입이 8바이트라는걸 알수있다. 그리고 아까 만들었던 ./a.exe를 실행해봤더니 powershell과 동일하게 나오는게 보인다. 즉, 컴파일러가 어떤 데이터모델을 쓸지 결정하며, 컴파일을 한 OS를 타겟하도록 설정되어있다.


비트 크기에 따른 표현범위

이제 비트 크기는 알았으니 그 표현범위를 알아보겠다. 혹시 모르는 사람을 위해 다른 타입들의 비트 크기를 적어두겠다.

charshortintlonglong longfloatdouble
8163232또는64643264

표현범위는 평소에는 approximate만 알아두고 Exact한 값은 그냥 아래처럼 #include<limits> 하고 매크로 쓰자.

#include<limits>
int max = INT_MAX;
int min = INT_MIN;
long long llmax = LLONG_MAX

다른 매크로는 여기가서 보면 된다.

비트 크기에 따른 정수 범위

signed

8(char)16(short)32(int)64(longlong)
-128~127± 3.27 · 10^4± 2.14 · 10^9± 9.22 · 10^18

unsigned

8(char)16(short)32(int)64(longlong)
0~2556.55 · 10^44.29 · 10^91.84 · 10^19

비트 크기에 따른 부동소수점 범위

32(float)64(double)
±3.4 · 10^38±1.79 · 10^308

참고문헌
https://en.cppreference.com/w/cpp/language/types
https://stackoverflow.com/questions/49311731/force-lp64-data-model-with-gcc-or-clang-in-windows

profile
문서는 독자를 위해 쓰는것

0개의 댓글

관련 채용 정보