ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2.2 정수형
    C++일기 2021. 5. 4. 00:01

     

     

    제가 빠르게 복기하기 좋게 정리한 글입니다. 파일을 추가하는 세세한 방법과 과정은 마지막에 첨부된 영상으로 확인하시면 좋을 것 같습니다 :) 강의목차의 번호와 같은  목차번호를 사용하고 있으니 참고하세요!

     

     


     

     

    요지 : 각 자료형에는 가질 수 있는 데이터양의 제한이 있고 그 범위를 넘어서는 데이터를 선언하면 문제가 발생한다. 

     

    # 각 자료형이 차지하는 메모리크기 파악

    (단, char만 정수형이 아니다.)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <iostream>
     
    int main()
    {
        using namespace std;
     
        short s = 1;
        int i = 1;
        long l = 1;
        long long ll = 1;
        char c = 'c';
     
        cout << sizeof(short<< endl// 2 bytes = 16 bits
        cout << sizeof(int<< endl// 4 bytes = 32 bits
        cout << sizeof(long<< endl// 4 bytes = 32 bits
        cout << sizeof(long long<< endl// 8 bytes = 64 bits
        cout << sizeof(char<< endl// 1 bytes = 8bits
     
        return 0;
    }
    cs

    먼저 short를 살펴보면 16 bits의 메모리를 차지한다. 그 의미는 2의 16제곱가지의 수를 표현할 수 있다는 것.

    그 중 하나의 bit는 양인지 음인지를 구분하는데 쓰이고

    총 데이터 중 하나는 0을 나타내야 한다.

    이를 바탕으로 short가 나타낼 수 있는 최대의 양의 정수를 구해보자.

     

    # short자료형 최대 양의 정수 구하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <iostream>
    #include <cmath> //제곱계산 함수 pow가 정의된 라이브러리
     
    int main()
    {
        using namespace std;
     
        short s = 1;
        
        // short자료형 총 2 bytes = 16 bits
        // +-구분하는데 1 bit 사용
        // 0 제외
        cout << pow(2sizeof(short* 8 - 1- 1  << endl// 32767이 최대 양의정수
        
     
        return 0;
    }
    cs

     

    # short 자료형이 나타낼 수 있는 최대, 최소 숫자 구하는 함수

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <iostream>
    #include <cmath> // 제곱계산 함수 pow가 정의된 라이브러리
    #include <limits> // 자료형의 한계관련 함수들
     
    int main()
    {
        using namespace std;
     
        short s = 1;
        
        // short자료형 총 2 bytes = 16 bits
        // +-구분하는데 1 bit 사용
        // 0 제외
        cout << pow(2sizeof(short* 8 - 1- 1  << endl// 32767
        
        // 위치가 복잡하지만 자료형 크기파악을 위해 자주 쓰이는 함수
        cout << std::numeric_limits<short>::max() << endl// 32767
        cout << std::numeric_limits<short>::min() << endl// -32767
        cout << std::numeric_limits<short>::lowest() << endl// -32767
     
        return 0;
    cs

     

    주의!! 위의 코드를 실행하면

    32767

    32767

    -32768

    -32768

    이 나온다.

    어? 왜 -32767이 아니지???라고 생각이 들었다. 조금 더 생각해보면

    총 16 bits 중에서 하나는 +-부호 구분에 쓰인다고 했다. 그렇게 되면 2^15개의 수를 양으로 표현하고 2^15개의 수를 음으로 표현할 수 있는데 프로그램에서 0을 또 표현해줘야 하는데 이 0의 위한 메모리를 양의 수에서 하나 뺀다. 때문에 양의 최대수는 2^15-1인 32767이고 음의 최소수는 -32768이 된다.

     

    # overflow : 원을 이루는 띠처럼

    원을 이루는 띠처럼 표현가능한 최대의 수에서 1을 더하면 표현가능한 최소의 수로 넘어가게 된다.

    아래의 코드는 최대의 수에서 +1을 하였을 때, 최소의 수에서 -1을 하였을 때는 보여준다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #include <iostream>
    #include <cmath> // 제곱계산 함수 pow가 정의된 라이브러리
    #include <limits> // 자료형의 한계관련 함수들
     
    int main()
    {
        using namespace std;
     
        short s = 1;
        
        //cout << std::numeric_limits<short>::max() << endl; // 32767
        //cout << std::numeric_limits<short>::min() << endl; // -32768
        //cout << std::numeric_limits<short>::lowest() << endl; // -32768
     
        s = std::numeric_limits<short>::max();
        s += 1;
     
        cout << s << endl// -32768
     
        s = std::numeric_limits<short>::min();
        s = s - 1;
        cout << s << endl// 32767
        
     
        return 0;
    }
    cs

     

    # int 자료형에 할당되는 메모리 크기

     

     

    # long 자료형

    long 자료형의 메모리 할당량은 int 자료형과 같은 4 bytes 였다.

     

    # long long 자료형

    확실히 long long으로 나타낼 수 있는 수는 어마어마하다.

     

     

    # unsigned short 자료형

    unsigend short 자료형의 경우 unsigned, 즉 부호를 고려하지 않는다. 0과 양의 정수만을 나타내면 되므로 할당된 2 bytes = 16 bits를 온전히 수에 쓸 수 있다. 가장 큰 수에서 1을 키운 값을 할당하면 이 때에도 overflow가 발생하여 가장 작은 수 0이된다.

     

     

    # unsigned int 자료형

    unsiged int도 마찬가로 원래 int의 할당메모리 4 bytes = 32 bits를 모두 0과 양의 정수로 쓸 수 있다.

    가장 큰 수에서 +1을 하면 overflow로 인해 가장 작은 수로 넘어간다.

     

     

    # unsigned 자료형에 -수를 할당하면?

    unsigned int 자료형의 표현가능한 최소값은 0이다. 0에서 -1을 하게 되면 overflow가 발생해 최대값으로 연결된다. 따라서 아래의 실행값이 나오게 된다.

     

     

    # 나누기에서 조심

    정수형 자료에 실수가 할당되면 정수만 할당된다.

    정수끼리 나눗셈의 결과는 정수형으로 출력된다.

    둘 중 하나라도 실수형이면 나눗셈 결과는 실수형으로 출력된다.

     

     


    출처)

    홍정모의 따배씨++

     

    www.youtube.com/watch?v=TA82U984UTE&t=616s

     

    좋은 강의에 너무나 감사하다.

    이전에는 그냥 무작정 따라썼던 코드들을 한줄한줄 이해하며 공부할 수 있다.

    언젠가 어느 언어든 자신감이 있는 코드마스터가 될 것이다.

     

    데이터가 인간을 대신해 일을 하게하고

    데이터를 제어해 로봇을 제어하고 싶다.

     

    '아앙의 전설'에서 주인공은 물/불/흙/공기 원소를 자유자재로 다룬다.

    수많은 데이터가 넘실대는 현대에서는 데이터를 자유자재로 다루는 프로그래머.

    실력있는 프로그래머가 되기 위해서는 코드 한줄이 내부적으로 어떻게 작동되는지를 이해해야한다.

    728x90
    반응형

    댓글 0

Designed by Tistory.