22년 3월 7일
#include <iostream>
int main()
{
//short: 2byte -32768~32767
short Number = -32770;
/*
1 > C:\Programming\C\220307\220307\main.cpp(6, 17) : warning C4309 : '초기화 중' : 상수 값이 잘립니다.
값의 범위를 벗어나는 값을 넣어 줄 경우에는,
에러는 나지 않지만 우리가 의도하지 않은 값이 나온다.
short 변수에 32768을 저장하면 -> -32768이 나온다.
*/
std::cout << Number << std::endl;
bool Test1 = 5000;
std::cout << Test1 << std::endl;
//Cf)한글, 한문, 일본어 같은 경우는 char 함수에 저장할 수 없다.(2byte 사용)
//문자 하나는 작은 따옴표 안에 저장하면 된다.
//밑의 'A'라는 문자에 마우스를 가져다 대면 65라는 숫자가 보인다.
//우리가 입력한 문자를 아스키 코드값으로 변환하여 저장한다.
char Text = 'A';
int Number1 = 'A';
std::cout << Text << " = " << Number1 << std::endl;
/*
int Number2;
std::cout << Number2 << std::endl;
에러: 초기화되지 않은 Number2 지역 변수를 사용했습니다.
이전 버전의 컴파일러는 에러로 취급하지 않고 경고로 취급함
값을 초기화하지 않으면 변수에 쓰레기값이 할당된다.
변수는 값의 대입이 없을 경우 쓰레기값이 들어가 있다.
그러므로 항상 변수의 값은 초기화를 해두고 사용하도록 한다.
*/
/*
변수는 선언을 하면 기본으로 signed가 된다.
모든 변수 타입들은 unsigned 키워드를 이용해서 -값을 +값으로 변환하여 사용할 수 있다.
short = -32768 ~ 32767
unsigned short = 0 ~ 65535
마찬가지로 이 변수도 지정 가능한 범위를 벗어나면 범위의 첫 값 혹은 끝 값으로 돌아간다.
*/
unsigned short Number3 = 65536;
std::cout << Number3 << std::endl;
/*
상수: 한 번 값을 지정하면 변경할 수 없다.
const 키워드를 이용하면 변수를 상수로 만들 수 있따.
*/
const int Number4 = 202020;
//아래는 Number4가 상수이기 때문에 값을 변경할 수 없다.
//팀 작업을 할 때 많이 쓰이게 될 것임.
//Number4 = 3333; << 식이 수정할 수 있는 lvalue 입니다.(에러)
const unsigned int Number5 = 29828283;
//이런 식으로 상수와 언사인드를 동시에 사용할 수도 있다.
/*
사칙연산자 : +, -, *, /(사칙연산), %(나머지, 모드 연산자), ++, --(증감연산자)
* 나머지 연산(%)
10%3 = 몫은 3이 나오고 나머지는 1 >> 결과값은 1
기본적으로 정수만 연산해주는 연산자
ex)홀짝 구하기 등
*/
/*
* 나눗셈 연산(/)
나눗셈은 연산시에 A와 B가 모두 정수라면 소수점 자리가 잘리고 정수부분 값으로 나오게 된다.
10/3 = 3.3333333333333333 (X)
10/3 = 3 (O)
그러므로 소수점 단위까지 계산할 때는 실수가 반드시 포함되어 있어야 한다.
CF)컴퓨터에게 나눗셈은 곱셈보다 더 부담가는 연산이다.
따라서, 4/2보다 4*0.5가 더 빠르게 계산된다.
*/
std::cout << "10 / 3 = " << 10 / 3 << std::endl;
std::cout << "10 / 3f = " << 10 / 3.0f << std::endl;
/*
증감 연산(++, --)
변수에 사용 가능한 연산자.
변수의 앞 또는 뒤에(전치/후치) 붙일 수 있다.
*/
int Number6 = 100;
std::cout << "Number6 = " << Number6 << std::endl;
//아래처럼 변수의 뒤에 ++을 붙여주게 되면 먼저 변수에 있는 값을 출력한 후에 1이 증가하게 된다.
std::cout << "Number6++ = " << Number6++ << std::endl;
std::cout << "Number6 = " << Number6 << std::endl;
//아래처럼 볕수의 앞에 ++을 붙여주게 되면 먼저 값을 증가시킨 후에 그 값을 출력을 하게 된다.
std::cout << "++Number6 = " << ++Number6 << std::endl;
//전위연산: 레지스터->ALU->메모리->출력
//후위연산: 레지스터->ALU->출력->메모리
//나중에 멀티스레드 수업 때 자세하게 배울예정.
/*
관계연산자: 값을 비교하는 연산자
<, >, <=, >=, ==(같다), !=(다르다)
결과값이 true, false로 나오게 된다.
ex)10 < 20 = true
10 > 20 = true
10 >= 20 = false
10 == 20 = false
10 != 20 = true
*/
std::cout << "10 < 20 = " << (10 < 20) << std::endl;
std::cout << "10 > 20 = " << (10 > 20) << std::endl;
std::cout << "10 <= 20 = " << (10 <= 20) << std::endl;
std::cout << "10 >= 20 = " << (10 >= 20) << std::endl;
std::cout << "10 == 20 = " << (10 == 20) << std::endl;
std::cout << "10 != 20 = " << (10 != 20) << std::endl;
/*
논리연산자: &&(AND), ||(OR -> Shift + \), !(NOT)
참/거짓: 참/거짓을 연산하여 결과로 참/거짓이 나오게 된다.
AND: A와 B 둘 다 참일 경우에만 참이 되고 나머지는 거짓이 된다.
OR: A와 B 둘 중 하나라도 참이면 참이고 아니면 거짓이 된다.
A B AND OR
0 0 0 0
1 0 0 1
0 1 0 1
1 1 1 1
A NOT
0 1
1 0
*/
std::cout << "false && false = " << (false && false) << std::endl;
std::cout << "true && false = " << (true && false) << std::endl;
std::cout << "false && true = " << (false && true) << std::endl;
std::cout << "true && true = " << (true && true) << std::endl;
std::cout << "false || false = " << (false || false) << std::endl;
std::cout << "true || false = " << (true || false) << std::endl;
std::cout << "false || true = " << (false || true) << std::endl;
std::cout << "true || true = " << (true || true) << std::endl;
std::cout << "!false = " << (!false) << std::endl;
std::cout << "!true = " << (!true) << std::endl;
/*
10진수: 0~9 사이의 숫자를 조합하여 사용한다
2진수: 0~1 사이의 숫자를 조합하여 사용한다.
8진수: 0~7 사이의 숫자를 조합하여 사용한다.(자주 사용하지 않음)
16진수: 0~15 사이의 숫자를 조합하여 사용한다.
CF)16진수의 경우 0~9는 일반 숫자로 사용을 하고 10~15 사이는 알파벳 a~f로 사용한다.
10==a, 11==b, 12==c, 13==d, 14==e, 15==f
c++에서 16진수를 표현하는 방법: 0x(숫자) -> 0x11, 0xb
2진수를 표현하는 방법 11b
10진수 123을 2진수와 16진수로 변환해 보자.
*10진수 -> 2진수
2진수로 변환. 10진수를 2로 계속 나누어서 몫과 나머지를 구하낟.
123 / 2 = 61 --- 1
61 / 2 = 30 ---- 1
30 / 2 = 15 ---- 0
15 / 2 = 7 ----- 1
7 / 2 = 3 ------ 1
3 / 2 = '1' ---- 1
--> 1 1 1 1 0 1 1(2)
*2진수 -> 10진수
64 32 16 8 4 2 1
64+32+16+8+2+1 = 123(10)
*2진수 -> 16진수
16진수 한 자리는 이진수 네 자리로 구성된다.
2진수 가장 오른쪽부터 네 자리씩 분리한다.
0111 / 1011
8421 / 8421 --> 1인 부분들만 더해주기
7 / b --> 0x7b
*16진수 -> 2진수
0x7=7(10)
7 / 2 = 3 --- 1
3 / 2 = 1 --- 1
--> 111(2)
0xb=11(10)
11 / 2 = 5 --1
5 / 2 = 2 ---1
2 / 2 = 1 ---0
-->1011(2)
111011(2)
TIP)검증하는법: 윈도우즈 계산기에 '프로그래머' 계산기 활용하면 편함.
*/
/*
비트단위 논리연산자: &(AND), |(OR), ~(NOT), XOR:eXclusive OR(^)
A B XOR
0 0 0
1 0 1
0 1 1
1 1 0
서로 다를 경우에만 true 반환
99 / 2 = 49 -- 1
49 / 2 = 24 -- 1
24 / 2 = 12 -- 0
12 / 2 = 6 --- 0
6 / 2 = 3 ---- 0
3 / 2 = 1 ---- 1
99: 1100011
123: 1111011
123 & 99 = 99
1111011
&1100011
=1100011
123 | 99 = 123
1111011
|1100011
=1111011
~123 =
~00000000 00000000 00000000 01111011 *4bte이므로
=11111111 11111111 11111111 10000100
123 ^ 99 = 24
1111011
|1100011
=0011000
*/
std::cout << "123 & 99 = " << (123 & 99) << std::endl;
std::cout << "123 | 99 = " << (123 | 99) << std::endl;
std::cout << "~123 = " << (~123) << std::endl;
std::cout << "123 ^ 99 = " << (123 ^ 99) << std::endl;
/*
변수를 비트단위로 쪼개서 사용할 때 사용
ex)int변수는 4byte이므로 32개의 bit별로 bool값을 저장하는 등
내일 수업에서 비트 연산자의 예시를 보여줄 예정.
*/
//항상 공부할 때는 하나하나 꼼꼼히 검증하면서 공부를 하자!
return 0;
}