이 글은 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';
}
4
4
8
./a.exe를 실행했더니 두번째줄에 있는 long타입이 4바이트라는걸 알수있다.
4
8
8
./a.out를 실행했더니 두번째줄에 있던 long타입이 8바이트라는걸 알수있다. 그리고 아까 만들었던 ./a.exe를 실행해봤더니 powershell과 동일하게 나오는게 보인다. 즉, 컴파일러가 어떤 데이터모델을 쓸지 결정하며, 컴파일을 한 OS를 타겟하도록 설정되어있다.
이제 비트 크기는 알았으니 그 표현범위를 알아보겠다. 혹시 모르는 사람을 위해 다른 타입들의 비트 크기를 적어두겠다.
char | short | int | long | long long | float | double |
---|---|---|---|---|---|---|
8 | 16 | 32 | 32또는64 | 64 | 32 | 64 |
표현범위는 평소에는 approximate만 알아두고 Exact한 값은 그냥 아래처럼 #include<limits> 하고 매크로 쓰자.
#include<limits>
int max = INT_MAX;
int min = INT_MIN;
long long llmax = LLONG_MAX
다른 매크로는 여기가서 보면 된다.
8(char) | 16(short) | 32(int) | 64(longlong) |
---|---|---|---|
-128~127 | ± 3.27 · 10^4 | ± 2.14 · 10^9 | ± 9.22 · 10^18 |
8(char) | 16(short) | 32(int) | 64(longlong) |
---|---|---|---|
0~255 | 6.55 · 10^4 | 4.29 · 10^9 | 1.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