C++ Rookiss Part1 C++ 프로그래밍 입문 : 데이터 갖고 놀기
🙇♀️데이터 갖고 놀기
🪐정수
#include <iostream>
using namespace std;
// 0이 아닌 초기화 값이 있으면 .data 영역
int hp = 100;
// 초기값이 0이거나, 초기값이 없는 변수라면 .bss 영역
char a; // 1byte (-128~127)
short b; // 2byte (-32768~32767)
int c; // 4byte (-21.4억~21.4억)
__int64 d; // 8byte (long long) (매우 큼)
unsigned char a; // 1byte (0~255)
unsigned short b; // 2byte (0~65535)
unsigned int c; // 4byte (42.9억)
unsigned __int64 d; // 8byte (long long) (매우 큼)
// 참고) 이론적으로 양수만 존재할 수 있는 데이터 unsigned
int main()
{
cout << "체력이" << hp << "남았습니다" << endl;
}
🪐불리언과 부등소수점
- 실수 (부동소수점)
- .을 유동적을 움직여서 표현하는 방법
1) 정규화 0.3141592 * 10 2) 3141582 (유효숫자) 1 (지수)
- float 부호(1) 지수(8) 유효숫자(23) = 32비트 = 4바이트
-
double 부호(1) 지수(11) 유효숫자(52) = 64비트 = 8바이트
- 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 10000000 1011000’0000’0000’0000’0000
- 1) 2진수 변환 = (3) + (0.375) = 0b11 + 0b0.011 = 0b11.011
- 프로그래밍할 때 부동소수점은 ‘근사값’이라는 것을 기억
- 특히 수가 커질 수록 오차 범위도 매우 커짐
- 실수 2개를 == 으로 비교하는 것은 지양
🪐문자와 문자열
// char : 알파벳 / 숫자 문자를 나타낸다 // wchar_t : 유니코드 문자를 나타낸다
// ASCII (American Standard Code for Information Interchange)
// ‘문자’의 의미로 작은 따옴표 ‘’ 사용 char ch = ‘a’; char ch2 = ‘1’; char ch3 = ‘a’ + 1;
wchar_t wch = L’안’;
- Escape Sequence
- 표기하기 애매한 애들을 표현
- \0 = 아스키코드0 = NULL
- \t = 아스키코드9 = Tab
- \n = 아스키코드10 = LineFeed (한줄 아래로)
- \r = 아스키코드13 = CarriageReturn (커서 «)
- '
- 문자열
- 정수 (1~8바이트) 고정 길이로
- 끝은 NULL (0)
int main()
{
char str[] = { 'h', 'e', 'l', 'l', 'o', '\0'};
char str2[] = "Hello World";
wchar_t str3[] = L"Hello World";
cout << str << endl;
// cout은 char 전용
wcout.imbue(locale("kor"));
wcout << wch << endl;
}
🪐산술 연산
unsigned char flag; // 부호를 없애야 >> 를 하더라도 부호비트가 딸려오지 않음
- 산술 연산자
- a에 b를 대입하고 b를 반환한다
- -> b라는 바구니 안에 있는 값을, a라는 바구니 안에다 복사한다
- 언제 필요한가? (사실 많이는 없음)
- 비트 단위의 조작이 필요할 때
- 대표적으로 BitFlag
- ~ bitwise not
- 단일 숫자의 모든 비트를 대상으로 0은 1, 1은 0으로 뒤바꿈
- & bitwise and
- 두 숫자의 모든 비트 쌍을 대상으로 and를 한다
-
bitwise or : - 두 숫자의 모든 비트 쌍을 대상으로 or를 한다
- ^ bitwise xor
- 두 숫자의 모든 비트 쌍을 대상으로 xor를 한다
- 비트 좌측 이동 : «
- 비트열을 N만큼 왼쪽으로 이동
- 왼쪽의 넘치는 N개의 비트는 버림. 새로 생성되는 N개의 비트는 0.
- *2를 할 떄 자주 보이는 패턴
- 비트 우측 이동 : »
- 비트열을 N만큼 오른쪽으로 이동
- 오른쪽의 넘치는 N개의 비트는 버림
- 왼쪽 생성되는 N개의 비트는
- 부호 비트가 존재할 경우 부호 비트를 따라감 (부호있는 정수라면 이 부분을 유의)
- 아니면 0
실습
-
0b0000 [무적][변이][스턴][공중부양]
-
무적 상태로 만든다
flag = (1 << 3);
- 변이 상태를 추가한다 (무적 + 변이)
flag |= (1 << 2);
- 무적인지 확인하고 싶다? (다른 상태는 관심 없음)
- bitmask
bool invincible = ((flag & (1 << 3)) != 0);
- 무적이거나 스턴 상태인지 확인하고 싶다면?
bool mask = (1 << 3) | (1 << 1);
bool stunOrInvincible = ((flag & 0b1010) != 0);