* 프로그램을 구성하는 가장 핵심 요소는 데이터와 로직
* 전역변수와 static 변수 차이
(1) 전역변수(단, 다른 파일에서 접근하려면 extern 선언 필요)
프로그램 전체에서 공유(가게의 금고), 어디서나 접근 가능
(2) static 변수
특정 함수에서 값을 유지(직원 통장), 함수 외부에서는 볼 수 없음
(3) 전역 static 변수
파일 내에서만 사용 가능한 금고(지점의 비밀 금고), 다른 파일에서 접근 불가
* 공식문서_데이터 형식 범위
https://learn.microsoft.com/ko-kr/cpp/cpp/data-type-ranges?view=msvc-170
* 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
* 해당 글은 게임 프로그래머 입문 올인원 강의를 보고 정리한 글입니다.
'게임프로그래밍 > 게임 프로그래머 입문 올인원' 카테고리의 다른 글
[게임 프로그래머 입문 올인원] 분기문, 반복문 (0) | 2024.12.18 |
---|---|
[게임 프로그래머 입문 올인원] 산술 연산, 비교 연산, 논리 연산 (0) | 2024.12.16 |
[게임 프로그래머 입문 올인원] 컴퓨터 구조 (0) | 2024.12.12 |
[게임 프로그래머 입문 올인원] OT (0) | 2024.12.10 |