제가 빠르게 복기하기 좋게 정리한 글입니다. 파일을 추가하는 세세한 방법과 과정은 마지막에 첨부된 영상으로 확인하시면 좋을 것 같습니다 :) 강의목차의 번호와 같은 목차번호를 사용하고 있으니 참고하세요!
요지 : 각 자료형에는 가질 수 있는 데이터양의 제한이 있고 그 범위를 넘어서는 데이터를 선언하면 문제가 발생한다.
# 각 자료형이 차지하는 메모리크기 파악
(단, 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(2, sizeof(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(2, sizeof(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
좋은 강의에 너무나 감사하다.
이전에는 그냥 무작정 따라썼던 코드들을 한줄한줄 이해하며 공부할 수 있다.
언젠가 어느 언어든 자신감이 있는 코드마스터가 될 것이다.
데이터가 인간을 대신해 일을 하게하고
데이터를 제어해 로봇을 제어하고 싶다.
'아앙의 전설'에서 주인공은 물/불/흙/공기 원소를 자유자재로 다룬다.
수많은 데이터가 넘실대는 현대에서는 데이터를 자유자재로 다루는 프로그래머.
실력있는 프로그래머가 되기 위해서는 코드 한줄이 내부적으로 어떻게 작동되는지를 이해해야한다.
'기계공학부 시절의 기록 > C++일기' 카테고리의 다른 글
2.6 불리언 자료형 (0) | 2021.05.05 |
---|---|
2.3 ~ 2.5 고정너비정수, void, double, 절단오차 (0) | 2021.05.05 |
2.1 기본자료형 (0) | 2021.05.03 |
1.12 ~ 1.13 헤더가드가 필요한 이유(LINK ERROR), Namespace (0) | 2021.05.03 |
1.10~ 1.11 함수파일쪼개기, 헤더파일 만들기 (0) | 2021.05.02 |
댓글