[C++] C++에서 사용되는 개념 5탄

Patrick!·2022년 8월 29일
0
post-thumbnail

데이터를 가지고 놀아보는 개념으로 접근하자.

사실 데이터를 어떻게 가공하고 이를 어떻게 해석하느냐가 프로그레밍에선 매우 중요한 개념이라고 본다. 그렇기에 아무리 어려운 C++ 라도 즐겁게 접근해보고자.

이를 놀아보겠다고(?) 생각하자.

1. 정수?

정수? (수학시간에 배운 걸 말하는건가?)

우선 C++에서 0이 아닌 초기화 값이 있으면 .date 영역에 해당한다.
int gold = 100; (data 영역에 해당)

초기값이 0이거나, 초기값이 없는 변수라면 .bss 영역
int silver = 0; int bronze;

그럼 정수를 선언하는 방법은?

char hp; -> 1byte
short mp; -> 2byte
int sp; -> 4byte
__int64 money; -> 8byte

각각 저장하는 용량의 차이에 따라 나타낼 수 있는 수의 범위도 매우 차이가 난다.

여기서 중요한 개념이 있다.
위의 모든 선언 방법은 0 을 포함한 음수 부터 양수를 포함한 개념의 선언이다.

하지만 게임을 만들때, 유저의 레벨이 음수 영역으로 표현될 일은 결코 없다. 그렇기에 음수를 제외하고 선언할 필요가 있다.

그 개념이 unsigned 의 개념이다.
unsigned음수영역을 사용하지 않고, 0부터 양수의 영역을 사용한다는 의미이다.

unsigned int gold = 100; => unsigned [타입][변수명] 으로 선언하면 된다.

왜 이렇게 선언하는 방법이 다른 것인가?

이는 변수라는 개념의 상자가 있다면 이 상자의 틀이 다른 개념이기 때문이다.

게임영역의 가장 큰 문제라 생각되는 최적화(메모리의 최소화 최대효율)를 위해서는 언제나 이를 표현하는 단위를 조절할 필요가 있다.

콘솔/모바일 게임 => 보통은 기기의 한정된 메모리의 할당으로 인해 매우 중요한 사항이다.

온라인 게임 => 기기의 영향은 컴퓨터의 스팩을 올리면 완화할 수 있으나 몇 만명이 동시에 사용하기에 언제나 메모리적인 측면을 생각할 수 밖에 없다.

2. 불리언과 부동소수점?

boolean? 참거짓? / 부동소수점? 실수인가?

Boolean은 Java 를 배우면서 true or false를 나타내는 타입으로 배웠었다. 하지만 사실 Boolean 자체는 정수에 해당한다고 한다?!

1 = true / 0 = false 에 해당하기 때문이다!
(Java를 배울 때, 분명 배웠겠지만 잊어버렸던거 같다!

부동소수점.(소수점)을 유동적으로 움직여서 표현하는 방법
3.141592 = 0.3141592 10 = 314.1592 10^2
위의 식들이 다 같은 의미인 것처럼 자유롭게 실수를 표현하는 것이라 보면된다.

하지만 이런 식으로 사용하는 것이 아닌... 정규화 작업을 거치게 된다.

정규화 작업이란?

정규화 = .(소수점)을 기준으로 유효숫자와 지수를 추출하는 과정
0.3141592 * 10 (사실상 이 형태가 정규화가 진행된 형태이다.)

유효숫자 = 3141592 / 지수 = 1 (10^1 의 지수를 가져온 것)

float과 double의 바이트는 2배 가량 차이가 나는데
float은 간단한 실수의 연산이 필요한 곳에 사용이 된다고 보면 된다.
double은 float의 2배 가량의 용량을 표현하기에 보다 세밀한 연산을 하는데 사용된다.

float = 부호(1) 지수(8) 유효숫자(23) = 32비트 = 4바이트
double = 부호(1) 지수(11) 유효숫자(52) = 64비트 = 8바이트

그럼 본격적으로 실수를 저장해보는 연습을 해보자
1) -3.375를 2진수로 변환
(-)부호는 우선 생략 / 3 + 0.375 로 나눈 후에
3 = 0b11 / 0.375 는 어떻게 2진법으로 나타내는가?

2진법의 경우 수가 커질 수록 2배씩 증가함 -> 수가 작아지면 2배씩 작아짐

.(소수점) 밑으로는 0.5 0.25 0.125 이런식으로 작아짐

0.375 = 0.5 0 + 0.25 1 + 0.125 * 1 => 0b0.011

0b11 + 0b0.011 = 0b1.1011 이라고 계산이 된다.

이를 정규화 해보자
0b1.1011 * 2^1 로 만들어지는데 그럼 이제 부호 지수 유효숫자를 뽑아내자

1 (부호) 1 (지수) 1011 (유효숫자)
단 지수는 unsigned byte로 보통 표현하기에 (지수)+127을 해줘야한다

결과 : 0b 10000000 1011000.0000.0000.0000.0000 이 된다.
메모리에 저장된 이 값을 추출하면 C058 0000 이라고 나와있다.
이를 계산기의 hex에 입력하면 결과값이 나온다.

프로그래밍에서 부동소수점은 언제나 '근사값'으로 사용되고 있다..
이는 단적인 예시 1/3 = 0.3333... 끊임없는 무한반복소수가 존재하기도 하며
너무 자세한 값을 사용하기에는 공수가 많이 들어가기에 ... '근사값'으로 사용한다.

profile
C++와 Unreal Engine / C#과 Unity / Katalon Studio를 통한 자동화 테스트 등을 하루하루 공부한 기록

0개의 댓글