거의 대부분은 아는 내용이라서 내용이 짧을것 같아 섹션을 묶어서 씀

 

[정수]

 

개인 프로젝트면 그냥 4바이트 8바이트 남발해도 별 문제가 없을수도 있지만 메모리가 늘 부족한 콘솔이나 모바일 또는 네트워크 통신이라면 아낄건 최대한 아끼는것이 좋다.

 

unsigned 사용 여부는 상황에 따라 다를 수 있다.

 

정수 오버플로우: 값의 범위를 초과하는 문제

 

[불리언과 부동소수점]

 

불리언 : 참/거짓만 갖고있는 값. 1바이트 정수에 불과함

어셈블리에서도 최소 단위인 al, ah도 1바이트이므로 표현값이 1비트여도 1바이트를 쓰게됨

 

부동 소수점

float는 뒤에 f를 붙여줘야함

float : 부호1비트 + 지수8비트 + 유효숫자23비트

double : 부호1비트 + 지수11비트 + 유효숫자 52비트

 

부동 소수점은 언제나 근사값이다. 수가 커질수록 오차 범위도 매우 커진다.

실수 두개를 == 으로 비교하는 것은 지양

 

더보기
// ex) -3.375라는 값을 저장
// 1) 2진수 변환 = (3) + (0.375) = 0b11 + 0b0.011 = 0b11.011
// 0.375 = 0.5*0 + 0.25*1 + 0.125*1 = 0b0.011
// 2) 정규화 0b1.1011 * 2^1
// 1(부호) 1(지수) 1011(유효숫자)
// 단, 지수는 unsigned byte라고 가정하고 숫자+127 만들어줌
// 예상 결과 : 0b 1 1000000 1011000..00
// 메모리를 열어보면 리틀 엔디안으로 저장되어 있는 것을 확인 할 수 있음

 

[문자와 문자열]

 

char: 알파벳 / 숫자 문자

wchar_t : UTF-16 유니코드 문자

 

유니코드는 표기 방식이 여러개다. 대표적으로 UTF-8, UTF-16

UTF-8 : 알파벳/숫자 1바이트, 유럽 지역의 문자는 2바이트, 한글/한자 등 3바이트

UTF-16 : 알파벳/숫자/한글/한자 등 거의 대부분 문자 2바이트

 

cout은 char 전용이라서 유니코드 표현이 안된다. wcout을 써야하는데 한국어라면 앞서 wcout.imbue(locale("kor")) 를 사용해야 한다.

 

Escape sequence: 표기하기 애매한 것들. tab, linefeed 등등

 

[산술 연산]

 

다른 얘기지만 #pragma region ~~ #pragma end region으로 범위의 내용을 접었다 폈다 가능

 

b = a++, b = ++a는 디스어셈블리로 열어보면 mov와 add의 순서가 다른것을 확인할 수 있다.

 

[비교 연산과 논리 연산]

 

비교 연산들은 값이 0 또는 1로 튀어나온다.

 

[비트 연산과 비트 플래그]

 

~ : bitwise not. 단일 숫자의 모든 비트를 뒤집음

& : bitwise and. 두 숫자의 모든 비트 쌍을 대상으로 and를 함

| : bitwise or. 두 숫자의 모든 비트 쌍을 대상으로 or를 함

^ : bitwise xor. 두 숫자의 모든 비트 쌍을 대상으로 xor를 함

<< : 비트열을 n만큼 왼쪽으로 이동. 넘치는 비트는 버림

>> : 비트열을 n만큼 오른쪽으로 이동. 넘치는 비트는 버림. 부호 비트가 존재할 경우 부호 비트를 따라감

 

비트단위로 뭔가 할때는 unsigned 타입으로 만들어 주는게 정신건강에 좋다.

 

bitmask: 원하는 비트 값만 추출. (ex: bool invincible = ((flag & (1 << 3) != 0);)

 

어떤 캐릭터의 상태이상 같은것을 검사할 때 유용하다.

 

[const와 메모리 구조]

 

하드코딩을 지양하라.

한번 정해지면 절대 바뀌지 않을 값들. const를 붙였으면 초기화가 반드시 이루어져야함.

 

데이터 영역에서도 초기값이 있는 경우 .data, 없는 경우 .bss, 읽기 전용은 .rodata에 들어간다.

상수라고 해도 const가 반드시 .rodata 영역에 들어가지는 않는다. C++ 표준은 아니고 컴파일러 마음이다.

하지만 웬만해서는 지역 변수로 사용하면 스택 영역에 들어간다.

 

[유의사항 & 팁]

 

변수의 유효범위

스택은 중괄호의 범위가 생존 범위이다.

 

연산 우선순위

연산자의 우선순위를 고려하지 않으면 원치 않는 결과가 나올 수 있다.

 

타입 변환

큰 타입에서 작은 타입으로 변환시 위쪽 비트 데이터가 잘린 상태로 저장된다.

정수->실수 변환 시 정밀도 차이가 있기 때문에 데이터가 손실될 수 있다.

signed->unsigned 변환 시 비트 단위로 보면 똑같은데, 분석하는 방법이 다르기 때문에 값이 다르게 나온다.

 

사칙 연산

곱셈: 오버플로우 조심

나눗셈: 0 나누기 조심. 정수끼리 나눈 결과를 신경 써야함

'C++ > Rookiss C++' 카테고리의 다른 글

[포인터] #2/2  (0) 2022.08.27
[포인터] #1/2  (0) 2022.08.26
[함수]  (0) 2022.08.26
[코드의 흐름 제어]  (0) 2022.08.26
[어셈블리 언어 입문]  (0) 2022.08.25

+ Recent posts