게임프로그래밍/게임 프로그래머 입문 올인원

[게임 프로그래머 입문 올인원] 변수, 정수의 원리, 변수의 마무리

shine94 2024. 12. 12. 22:06

* 프로그램을 구성하는 가장 핵심 요소는 데이터와 로직

 

* 전역변수와 static 변수 차이

(1) 전역변수(단, 다른 파일에서 접근하려면 extern 선언 필요)

   프로그램 전체에서 공유(가게의 금고), 어디서나 접근 가능

(2) static 변수

   특정 함수에서 값을 유지(직원 통장), 함수 외부에서는 볼 수 없음

(3) 전역 static 변수

   파일 내에서만 사용 가능한 금고(지점의 비밀 금고), 다른 파일에서 접근 불가

 

* 공식문서_데이터 형식 범위

   https://learn.microsoft.com/ko-kr/cpp/cpp/data-type-ranges?view=msvc-170

 

데이터 형식 범위

데이터 형식 범위에 대한 자세한 정보

learn.microsoft.com

 

* 0b 2진수, 0x 16진수

   비트 - 데이터가 저장되는 최소 단위

   음수 - 2의 보수

 

* 프로그래머 계산기

 

 

* 예제 코드

1.

#include <iostream>
using namespace std;

// [타입] [이름];
// Data 영역 : 전역 변수
// char                 : 1
// short                : 2
// int                  : 4
// __int64 (long long)  : 8

int hp;
int maxHp;

int main(void)
{
00961000  push        ebp  
00961001  mov         ebp,esp  
	maxHp = 100;
00961003  mov         dword ptr [maxHp (09633C8h)],64h  

	hp = maxHp;
0096100D  mov         eax,dword ptr [maxHp (09633C8h)]  
00961012  mov         dword ptr [hp (09633CCh)],eax  

	cout << hp;
00961017  mov         ecx,dword ptr [hp (09633CCh)]  
0096101D  push        ecx  
0096101E  mov         ecx,dword ptr [__imp_std::cout (0962038h)]  
00961024  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0962034h)]  

	return 0;
0096102A  xor         eax,eax  
}
0096102C  pop         ebp  
0096102D  ret

 

2.

#include <iostream>
using namespace std;

// [타입] [이름];

// 문자

char ch;

int main(void)
{
00D51000  push        ebp  
00D51001  mov         ebp,esp  
	ch = 'A';
00D51003  mov         byte ptr [ch (0D543C8h)],41h  
	
	cout << ch;
00D5100A  movzx       eax,byte ptr [ch (0D543C8h)]  
00D51011  push        eax  
00D51012  mov         ecx,dword ptr [__imp_std::cout (0D5304Ch)]  
00D51018  push        ecx  
00D51019  call        std::operator<<<std::char_traits<char> > (0D51030h)  
00D5101E  add         esp,8  

	return 0;
00D51021  xor         eax,eax  
}
00D51023  pop         ebp  
00D51024  ret

 

3.

#include <iostream>
using namespace std;

// [타입] [이름];

// 실수 -> 근사값 -> 부동 소수점의 오차

float speed;
double speed2;

int main(void)
{
00781000  push        ebp  
00781001  mov         ebp,esp  
	speed = 3.15f;
00781003  movss       xmm0,dword ptr [__real@4049999a (0782118h)]  
0078100B  movss       dword ptr [speed (07833D0h)],xmm0  
	speed2 = 3.15;
00781013  movsd       xmm0,mmword ptr [__real@4009333333333333 (0782110h)]  
0078101B  movsd       mmword ptr [speed2 (07833D8h)],xmm0  
	
	cout << speed;
00781023  push        ecx  
00781024  movss       xmm0,dword ptr [speed (07833D0h)]  
0078102C  movss       dword ptr [esp],xmm0  
00781031  mov         ecx,dword ptr [__imp_std::cout (078203Ch)]  
00781037  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0782034h)]  
	cout << speed2;
0078103D  sub         esp,8  
00781040  movsd       xmm0,mmword ptr [speed2 (07833D8h)]  
00781048  movsd       mmword ptr [esp],xmm0  
0078104D  mov         ecx,dword ptr [__imp_std::cout (078203Ch)]  
00781053  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0782038h)]  

	return 0;
00781059  xor         eax,eax  
}
0078105B  pop         ebp  
0078105C  ret

 


movss(Scalar Single Precision)

단정밀도(float) 부동소수점을 처리하는 명령

 

movsd(Scalar Double Precision)

배정밀도(double) 부동소수점을 처리하는 명령

 

__real

부동소수점 리터럴을 표현하기 위한 컴파일러 생성 심볼이며,

해당 값은 IEEE 754 형식으로 저장된 데이터이다

 

__real@4049999a ▶ float, 단정밀도 부동소수점으로 표현 ▶ 8자리 16진수

3.15의 근사값(16진수 표현 4049999a)

 

__real@4009333333333333 ▶ double, 배정밀도 부동소수점으로 표현 ▶ 16자리 16진수

3.15의 근사값(16진수 표현 4009333333333333)

 

IEEE 754 부동 소수점 값은 부호(Sign), 지수(Exponent), 가수(Mantissa)로 구성

 

float(단정밀도, 32비트) ▶ 32비트 ▶ 8자리 16진수

부호 1비트, 지수 8비트, 가수 23비트

 

double(배정밀도, 64비트) ▶ 64비트 ▶ 16자리 16진수

부호 1비트, 지수 11비트, 가수 32비트

 

xmm0

주로 부동소수점 연산과 벡터 연산에 사용되는 레지스터


 

4.

#include <iostream>
using namespace std;

// [타입] [이름];

// bool
bool playSound;

int main(void)
{
00CF1000  push        ebp  
00CF1001  mov         ebp,esp  
	playSound = false;
00CF1003  mov         byte ptr [playSound (0CF33C8h)],0  
	playSound = true;
00CF100A  mov         byte ptr [playSound (0CF33C8h)],1  

	return 0;
00CF1011  xor         eax,eax  
}
00CF1013  pop         ebp  
00CF1014  ret

 

 

 

 

* 해당 글은 게임 프로그래머 입문 올인원 강의를 보고 정리한 글입니다.

   강의_바로가기

 

[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버

Rookiss | 어디부터 시작할지 막막한 게임 프로그래밍 입문자를 위한 All-In-One 커리큘럼입니다. C++, 자료구조/알고리즘, STL, 게임 수학, Windows API, 게임 서버 입문으로 이어지는 알찬 커리큘럼으로

www.inflearn.com