본문 바로가기
기계공학부 시절의 기록/C++일기

2.2 정수형

by juhyeonglee 2021. 5. 4.
728x90
반응형

 

 

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

 

 


 

 

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

 

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

(단, 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
반응형

댓글