어셈블리 언어 입문
- 어셈블리 언어 부분은 실습 위주의 수업이였기 때문에 필기 하기 애매.
[문자와 엔디안]
메모리에 값을 저장할때 두가지 방법이 있다.
- 빅 엔디언 : 조금더 직관적이다.
- 리틀 엔디언 :
나중에 서버에서 data를 little endian으로 보내주는데 클라에서 받을때는 big endian으로 받게 되면, 완전히 다른 데이터를 받게 된다.
지금은 중요해보이지는 않지만, 나중 되면 큰 이슈가 될 수 있다.
리틀 엔디언 : 캐스팅에 유리하다.
빅 엔디언 : 숫자 비교에 유리
[ 데이터 갖고 놀기 ]
스택 메모리 , 스택 프레임
- 0 이 아닌 초기값이 있으면 .data 영역
- 초기값이 0 이거나, 초기값이 없는 변수라면 .bss 영역
char hp; // 1byte -128 ~ 127
short b; // 2byte -32,768 ~ 32,767
int c; //4byte -21억 ~ 21억
__int64 d; //8byte (long long) ( 어마어마하게 크다. )
unsigned char dhp; // 1byte 0 ~ 255
unsigned short db; // 2byte 0 ~ 65,536
unsigned int dc; // 4byte 0 ~ 42.9억
unsigned __int64 ad; //8byte (long long) ( 어마어마하게 크다. )
[ 정수 ]
부동 소수점은 항상 ' 근사 값' 이다
- float , double
- 실수 2개를 ==으로 비교하는 것은 지양.
[문자와 문자열 ]
ASCII ( American Standard Code for Information Interchange)
- 알파벳을 표기하는 국제 표준.
- 국제화 시대에는 영어만으로 서비스 할 수 없음
- 전 세계 모든 문자에 대해 유일 코드를 부여한 것이 유니코드 (unicode)
- 유니코드는 표기 방식이 여러가지가 있는데 대표적으로 UTF8 과 UTF16 이 있다.
UTF8
- 알바펫 , 숫자 1바이트 ( ASCII 동일한 번호 )
- 유럽 지역의 문자는 2바이트
- 한글, 한자 등 3바이트
UTF16 ( C#, MS에서는 UTF16 을 사용 )
- 알바펫, 숫자, 한글 ,한자 등 거의 대부분 문자 2바이트
아스키 코드를 저장하는 C++ 타입은 char
UTF16을 저장하는 타입은 wchar_t ( 문자 앞에 L 을 붙혀준다 )
wchar_t wch = L'안';
출력 하려고 cout 해주게 되면
50504 라는 숫자를 출력하는데
이는 cout이 wchar_t 를 오버로딩하고 있지 않아서이다.
wcout << wch << endl;
cout 말고 wcout을 사용하여 출력하여야한다.
심지어는 한글을 인식 못해서
wcout.imbue(locale("kor"));
해줘야 한다.
[ 산술 연산 ]
#pragma region
~~~~~
#pragma endregion
해주게 되면 함수가 아니여도 코드를 줄였다 폈다 할 수 있다.
[ 비트 연산 ]
~ bitwise not
단일 숫자의 모든 비트를 대상으로 0 은 1로 1은 0으로 뒤집음.
& bitwise and
두 숫자의 모든 비트 쌍을 대상으로, and를 한다.
| bitwise or
두 숫자의 모든 비트 쌍을 대상으로, or을 한다.
^ bitwsie xor
두 숫자의 모든 비트 쌍을 대상으로 xor을 한다.
= 둘 이 같으면 0 다르면 1
xor 의 특별한 특징.
같은 숫자 두개를 xor 하면 0이 나온다.
숫자를 두번 xor 하면은 원래 값이 나온다. ( 암호학에서 유용하게 사용 )
<< >> 비트연산을 할때는 비트연산 할 숫자를 unsigned 형태로 변경해주는것이 정신 건강에 좋다.
<< 를 할때 넘치는 N개의 비트는 버리고 새로 생성되는 N개의 비트는 0으로 만든다.
>> 를 할때 넘치는 N개의 비트는 버리는것 까지는 똑같은데 맨 왼쪽에 생성되는 부호 비트는 기존에 있던 숫자가 음수면 1로 되고 아니면 0으로 채운다.
Bit Flag
사실상 char는 1byte 짜리 정수랑 같은데,
여기에 특별한 의미를 부여하여 bit 단위로 사용할 수 있다면 주고 받는 패킷양을 줄일 수 있어서 유용하다.
0b 0000 [ 무적 ] [ 변이 ] [ 스턴 ] [ 공중부양 ]
물론 전부 boolean 타입으로 만들 수 도 있지만 노가다일 뿐더라 bool 도 1byte 짜리 데이터 타입이다.
// 0b 0000 [무적] [변이] [스턴] [공중부양]
unsigned char flag; // unsigned 이여야지 >> 를 하더라도 부호 비트가 딸려오지 않는다.
// 무적 상태로 만든다.
flag = 8; // ob 1000 이니깐 무적 상태는 맞지만, bit를 64개를 사용한다고 한다면 힘들다.
flag = (1 << 3);
// 변이 상태를 추가한다 ( 무적 + 변이 )
flag |= 4; // 마찬가지로 아래의 방법이 더 좋다.
flag |= (1 << 2);
// 무적인지 아닌지 확인하고 싶다. ( 다른 상태는 관심 없다. )
// BitMask
bool invincible = (flag & (1 << 3)); // 무적인 상태면 1이 아니니깐 True 가 나온다. or 0
// 무적이거나 스턴 상태인지 확인하고 싶다면?
bool mask = (1 << 3) | (1 << 1); // 0b1010
bool stunOrInvincible = (flag & mask);
'C++과 언리얼로 만드는 게임 개발 > Part1. C++ 문법' 카테고리의 다른 글
Day5 ( 47.32% ) (0) | 2022.03.28 |
---|---|
Day4 ( 42.85% ) (0) | 2022.03.25 |
Day3 ( 37.50% ) (0) | 2022.03.24 |
Day2 ( 29.46% ) (0) | 2022.03.24 |
인프런 [C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] 강의 Part1 시작 (0) | 2022.03.24 |