• 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);
}

+ Recent posts