c++ 기초를 안한지 너무 오래 지난거같아서 복기 겸 작성
여기서 괄호 안에 있는건 자료형 크기

(크기, byte)
정수 : char(1), short(2), int(4), long(4), long long(8)

char기준으로 보여준다면
맨 앞은 음수 양수로 나눌수 있는 플래그로 둔다 그러면 뒤에 7bit만 사용한다.
그래서 1 byte는 8비트 이고
char 은 -128 ~ 127 까지 표현이 가능하다.
// unsigned 양수만 사용될 변수에 넣는다. c = 0 ~ 255;
// 만약 256 넣는경우 0이된다
unsigned char c = 0;
// -128 ~ 127 까지 표현 가능하다 0 포함
char c1 = -1;
unsigned는 음수를 사용안하고 양수만 사용한다. 그러면 플래그 기준이 127넘어가면 플래그 올리고 추가로 계산해서
0 ~ 255까지 표현한다.
음수는 컴퓨터에서 다 플래그로 계산 하다보니 사실 -1 같은건 실제 -1이 아니다.
플래그가 0이 양수 1이 음수라고 가정하고
컴퓨터에는 사실 -가 없다 빼기가 없기 때분에 다 더하기 이다.
10 - 10 = 을 계산할경우 사실상 컴퓨터에서 10 + (-10) = 으로 봐야한다.
보통 정수 127을 0으로 만들고 싶으면 - 127을 더해야한다.
그걸 > 2진수로 계산해보자.
이걸 보자 127을 2진수로 바꾸로 -127을 반대로 생각해서 보통 앞에 플래그만 바꿔서 1 1111 1111 로 생각하는데 다르다.
사실 - 127은 1 0000 0001 이다. 이러한 음수 -를 알고싶으면 2의 보수 라는걸 공부해보자.
그러면 -1은 뭘까 1 1111 1111 이 -1이다.
위 그림에서 사실 더하기 로 빼기를 만든것이다.

역시 1 - -1도 검증 해볼수 있다.
그러면 c++에서 char에 255 넣으면 뭐라고 나올까.
unsigned char c = 255;
char c1 = 255;

-1로 나오는걸 확인할수 있다.
그러면 unsigned char c에 -1넣는다면 255인것도 유추 가능하다.
이 음수의 계산을 알아야 이 자료형에 byte를 이해하기 쉽다.
이걸 보면 예전에 게임들이 만렙 스탯이 255인경우나
게임 사건사고 보다가 데미지가 맥스치 넘어가서 갑자기 너무 약해진다거나 너무 약해지다가 갑자기 쌔진다던가 등등 이런경우가 있다.
실수형은 그러면 어떤 방식으로 처리 될까?
0.1 0.11 1.1...
처럼 무한히 늘어날수있는게 실수형인데 이걸 어떻게 처리 할수있을까?
컴퓨터에서는 부동 소수점 이란걸 사용한다.
부동 소수점 정밀도 문제가 있긴한데 실수를 정수 처럼 정확해서 표현할수없고 항상 근사치 를 찾아서 표현해주는거기때문에
이 정밀도 차이 때문에 발동해야할 if 나 이런게 걸릴수도있다.
위키 백과 - 부동 소수점
여기서 도 정확도 문제를 말하고있기 때문에 예시를 한번 체크하면 좋을꺼같다.
여기서 알수있는건 정수와 실수는 계산 방식이 다르다 라는걸 인지 하고 넘어 가면 좋을꺼같다.
보통 그러면 int형이랑 float 형이랑 계산이 가능할까?
그러면 계산 할때 자료형을 일치 시켜 주는게 좋다.
float f = 10.12345f + (float)20;
실수 10.12345f 에 20을 더해야하는데 정수 20 이기때문에 20.0f 변수라면 앞에 형변환 해주는 (float) 등 사용할수있다.
학생때도 많이 들어봤는데
수학을 하다보면 연산자에 우선 순위가 존재 한다.
간단하게 연산자로 +, -, *, /, % 등등 있고
증감 연산자로 ++ -- 이 있다.
int data = 10 + 10;
data = data + 20;
data += 20;
여기서 먼저 연산 하는건 + 이다 더하기 하고 나서 그걸 int data 변수에 대입 = 을 해주는거다.
그다음 data에 있는 값과 20을 더해주고 조금 간소화 하면 += 으로도 표현이 가능하다.
만약 =을 빼버려서 data + 20; 하면 대입이 없어서 값이 갱신을 안한다.
int data = 10 / 3;
data = 10 % 3;
나누기 하는 2가지 방법 인데 두가지의 차이는 3, 1이다.
이처럼 정수는 딱 맞아서 떨어지긴하는데 실수도 가능 한가?
실수는 소수점으로 계속 떨어지는데 가능한가?
실험 해보자.

에러난다 할수가 없다 실수는 나머지를 구할수없다 한쪽이 정수여도 똑같다.
하지만 나머지 말고 / 으로 계산은 할수있다.
int data = 10.f / 3.f;
int형으로 넣고 돌리면 3으로 나오는걸 알수있다. 하지만 이렇게 하면 다른사람이 보고 이거 실수한거야 아닌거야
알수 없으니 명확 하게 난 이걸 유도 했다고 표현 해줘야한다.
int data = (int)(10.f / 3.f);
증감 연산자에는 ++ -- 이 있다.
int data = 0;
data++; // 1
data++; // 2
data--; // 1
data--; // 0
그러면 여기서 그냥 1 증가 1 감수 로 볼수 있는데
나중에 쓰게 될껀데 포인터 개념이 들어가면 조금 달라진다.
즉 숫자 1증가 감소 로 볼수도있는데 한단계증가 감소로 보면 좋겠다.
data++; // 전위
++data; // 후위
data--;
--data;
물론 앞뒤로도 쓸수있다.
그럼 왜 나눈거냐 라고 생각할수있는데
후위 연산자는 제일 나중에 계산 된다. 대입보다도 늦게 연산된다.
int a = 10;
int data = a++;
이면 data는 10이된다. a는 그럼 11이다. 즉 대입후 증가 제일 나중에 연산 된다.
그럼 앞으로 들어가면 둘다 11이 된다.
int a = 10;
int data = ++a;
둘의 차이는 알고 있으면 좋다.
기본적으로 나오는 건 !(반대), &&(and), ||(or)
true(참) == ( 0이 아닌값 보통 1 ), false(거짓) == 0
int data = true; // 1
data = false; // 0
int로 구분 할수도 있긴하지만 제공하는 자료 형이 있다.
bool 이다.
bool data = true;
data = false;
만약 대입 하고 싶은값이나 비교 하고싶은값을 반대로 하고싶으면 앞에 !를 넣어준다.
bool data = true;
data = !data; // false
이번엔 && || 을 알아본다.
bool data = 100 && 200; // 양쪽값이 0이 아니라서 둘다 true if문에서도 비교를 여러개 하고싶을때 똑같이 사용가능하다.
data = 0 && 200; // false
data = 100 || 200; // true || 비교값중에 하나라도 참이 있으면 true 이다.
data = 0 || 200; // true
data = 0 || 0; // false