정수형(C++)

Kiwoong Park·2023년 6월 17일
0

출처 : C++ 실력 완성 올인원 패키지 Online[fastcampus]

선언과 초기화

#include <iostream>
#include <numeric> // 최대값, 최소값을 보기 위해 포함
int main()
{
		// 선언과 동시에 초기화
        // C 스타일 초기화
        int y = 1;
        cout << y;

        // C++ 스타일 초기화
        int z(2);
        cout << z << endl;
}

정수형 리터럴

// 정수형 리터럴
        int num0 = 11;   // 일반 정수 리터럴
        int num1 = 011;  // 8진수 정수 리터럴
        int num2 = 0b11; // 2진수 정수 리터럴
        int num3 = 0x11; // 16진수 정수 리터럴

        cout << "num0 " << num0 << endl; // 11
        cout << "num1 " << num1 << endl; // 8 + 1 = 9
        cout << "num2 " << num2 << endl; // 2 + 1 = 3
        cout << "num3 " << num3 << endl; // 16 + 1 = 17

정수형의 사이즈

		// Windows x86(32bit)의 경우 4/4/4
        // Windows x64(64bit)의 경우 4/4/8
        // Unix and Unix-like 환경은 다른 결과 출력
        int intNum = 0;
        long longNum = 0;
        int* intPointer = &intNum;

        cout << sizeof(intNum) << endl;
        cout << sizeof(longNum) << endl;
        cout << sizeof(intPointer) << endl;

고정폭 정수형

어느 환경에서도 고정된 길이를 보장하는 법

        int8_t num00 = 0;
        int16_t num11 = 0;
        int32_t num22 = 0;

        cout << sizeof(num00) << endl; // 1
        cout << sizeof(num11) << endl; // 2
        cout << sizeof(num22) << endl; // 4
        {
        // 리터럴 접미사를 이용하여 정수형의 세부 타입을 표현
        int intNum_ = 11;
        unsigned int uintNum = 11u;
        long int longNum_ = 0L;
        long long longLongNum = 0LL;
        unsigned long long ulongLongNum = 0uLL;
    }

Unsigned

메모리에 표시되는 방식

bit에 따른 정수의 최대값

	uint8_t num0 = 1;
	std::cout << (int)num0;

	cout << (int)numeric_limits<uint8_t>::max() << '\n'; // 형변환 필요
	cout << numeric_limits<uint16_t>::max() << '\n';
	cout << numeric_limits<uint32_t>::max() << '\n';
	cout << numeric_limits<uint64_t>::max() << '\n';
    
/* 65535
4294967295
18446744073709551615
*/

Signed

메모리에 표시되는 방식

부호 표시는 MSB로

음수의 표현 방법?

2의 보수를 취하는데 각 비트를 반전 후 1을 더한다.

아래와 같이 부호가 있는 숫자의 값을 알기 위해서는 역시 각 비트를 반전 후 1을 더해서 음수값을 알 수 있음.

signed 정수의 최대값

	cout << (int)numeric_limits<int8_t>::max() << '\n'; // 형변환 필요
	cout << numeric_limits<int16_t>::max() << '\n';
	cout << numeric_limits<int32_t>::max() << '\n';
	cout << numeric_limits<int64_t>::max() << '\n';  
/*    32767
2147483647
9223372036854775807
*/

sined 정수의 최소값

	cout << (int)numeric_limits<int8_t>::min() << '\n'; // 형변환 필요
	cout << numeric_limits<int16_t>::min() << '\n';
	cout << numeric_limits<int32_t>::min() << '\n';
	cout << numeric_limits<int64_t>::min() << '\n';
/*
-32768
-2147483648
-9223372036854775808
*/

덧셈

음수의 덧셈도 양수의 덧셈과 같은 방식으로 carry를 하나씩 올리면서 계산을 하면 된다.

뺄셈

뺄셈의 경우 2의 보수를 더해주는 방식으로 구현한다.

Overflow

표현할 수 있는 최대값보다 더 커지는 상태

uint32_t num32 = numeric_limits<uint32_t>::max();
uint32_t num32_ = num32 + 1;

cout << num32 << endl;
cout << num32_ << endl;
/*
4294967295
0
*/

Unsigned의 경우 1을 더하면 보이는 메모리에서 알 수 있듯 0으로 돌아감.

Signed의 경우 최대값에서 1을 더하면 최소값이 됨.

Underflow

표현할 수 있는 최저값보다 더 적어지는 상태

uint32_t num32 = numeric_limits<uint32_t>::min();
uint32_t num32_ = num32 - 1;
cout << num32 << endl;
cout << num32_ << endl;
/*
0
4294967295*/

profile
You matter, never give up

0개의 댓글