- 2.2.1 정수형(Integers) 종류
- 2.2.2 limits 헤더를 이용한 정수형 한계치 확인
- 2.2.3 overflow
- 2.2.4 고정 너비 정수(Fixed-width integers)
2.2.1 정수형(Integers) 종류
정수형애서 정수는 우리가 흔히 알고 있는 수학에서의 정수를 의미한다. C++에서 정수를 나타낼 수 있는 방법이 여러가지가 있는데, 그 종류를 한번 알아보도록 하자.
#include <iostream>
int main()
{
using namespace std;
cout << sizeof(short) << endl; // 2 bytes = 2 * 8 bits = 16 bits
cout << sizeof(int) << endl; // 4 bytes = 4 * 8 bits = 32 bits
cout << sizeof(long) << endl; // 4 bytes = 4 * 8 bits = 32 bits
cout << sizeof(long long) << endl; // 8 bytes = 8 * 8 bits = 64 bits
return 0;
}
코드에서는 4가지에 대해서 작성되어 있지만 char 또한 정수형으로 취급한다. 네트워크 계열을 다루는 사람들은 char 자료형을 1 byte 정수 자료형으로 사용한다. 그 외 정수 자료형은 short, int, long, long long이 있으며, int 자료형과 long 자료형은 같은 크기의 메모리를 소비한다. 메모리를 많이 사용할수록 더 넓은 범위의 수를 다룰 수 있게 된다.
수를 표현할 때 부호(sign)을 표현하기 위해 1 bit를 사용한다. 양수는 0으로 표현하며 음수는 1로 나타낸다. 자료형 앞에 unsigned 키워드를 추가하면 부호를 표현하기 위한 bit마저도 수를 표현하기 위해 사용하게 된다. 이때 음수는 표현할 수 없게 되니 주의하자. 또한 정수형끼리 나누기를 수행해서 소수점이 나오게 되고 그 수를 정수형에 저장하게 되면 소수점 아래의 수는 버림이 된다.
2.2.2 limits 헤더를 이용한 정수형 한계치 확인
limits 헤더를 이용하면 자료형의 수치적 한계치를 확인할 수 있다. 앞의 코드를 통해 short 자료형은 2 bytes(16 bits)임을 알 수 있다. 하나의 bit를 부호로 사용하면 총 15 bits를 수를 표현하는 메모리로 사용할 수 있다.
#include <iostream>
#include <cmath>
#include <limits>
int main()
{
using namespace std;
// 32767
cout << pow(2, sizeof(short) * 8 - 1/*부호 표현에 의한 -1*/) - 1/*0에 대한 -1*/<< endl;
cout << numeric_limits<short>::max() << endl; // 32767
cout << numeric_limits<short>::min() << endl; // -32768
cout << numeric_limits<short>::lowest() << endl; // -32768
return 0;
}
절대값으로 보면 양수가 음수보다 1이 작은 것을 알 수 있다. 부족한 부분은 0을 표현하기 위해 사용이 된다.
2.2.3 overflow
앞에서 언급하였듯이 메모리의 크기에 따라 표현할 수 있는 수의 한계치가 존재한다. 만약 해당 한계치를 뛰어넘는 수를 저장하면 어떻게 될까?
#include <iostream>
int main()
{
using namespace std;
short s = 32767;
cout << "short max : " << s << endl;
s = s + 1; // 32768
cout << "short max + 1 (overflow) : " << s << endl;
s = -32768;
cout << "short min : " << s << endl;
s = s - 1; // -32769
cout << "short min - 1 (overflow) : " << s << endl;
unsigned int iii = -1;
cout << iii << endl; // overflow
return 0;
}
short 자료형의 최대값은 32767이다. 32767을 저장하고 1을 더하게 되면 32768이 아닌 -32768이 되면서 최소값이 나온다. 이처럼 한계치를 뛰어넘어서 수의 법칙과는 다르게 결과값을 가지는 것을 overflow라고 한다. short 자료형의 최소값에 -1을 할 경우 최대값인 32767을 결과값으로 가진다.
2.2.4 고정 너비 정수(Fixed-width integers)
C++ 11부터는 어떤 플랫폼이던지 고정 너비 정수를 쓸 수 있도록 설정하는 방법이 생겼다. #include <cstdint>를 통해 설정하는 것이 원칙이지만 iostream을 include할 경우 별도로 include할 필요가 없다.
#include <iostream>
int main()
{
using namespace std;
int16_t i(5);
int8_t myint = 65;
cout << myint << endl;
int_fast8_t fi(5);
int_least64_t fl(5);
}
'Programming Language > C++' 카테고리의 다른 글
Section 2.4. 부동소수점수(floating point numbers) (0) | 2021.10.14 |
---|---|
Section 2.3. void (0) | 2021.10.12 |
Section 2.1. 기본 자료형 (0) | 2021.09.29 |
Section 1.10. 전처리기(Preprocessor) (0) | 2021.09.28 |
Section 1.9. 네임스페이스 (0) | 2021.09.27 |