오늘의 TIL 목차 (22.07.26)
- 표기법의 종류
- 상수 (const)
- 연산자의 종류 / sizeof, bitset
- 1의 보수, 2의 보수
표기법의 종류
표기법 : 변수 이름 설정 시 규칙에 맞게 설정하는 방법
1. 헝가리안 표기법 : 변수 명 앞에 각 자료형을 뜻하는 문자를 삽입하여 표기하는 방식
ex) int iA(0); float fA(0); char cA('D');
2. 카멜 표기법 : 단어와 단어 사이를 대문자로 구분하는 방식
ex) int playerAttack(0);
3. 파스칼 표기법 : 단어의 시작 글자를 대문자로 표기하는 방식
ex) int PlayerHp(0);
4. 언더바 표기법 : 단어와 단어 사이를 언더바(_)로 구분하여 표기하는 방식
ex)
int Draw_Circl(); //명령_지시어 형식으로 주로 사용
void Render(int _iHp) // 매개변수임을 나타내기 위해 변수명 앞에 언더바를 삽입하는 경우
상수
상수 : 변하지 않는 고정되어 있는 수
- 리터럴 상수 : 이미 정해져 있는 값
- 심볼릭 상수 : 어떤 기호를 이용하여 기존의 변수를 상수로 만들어 놓은 상태
* 반드시 선언과 동시에 초기화를 통해 어떤 값을 상수로 만들 것인지 명확히 표기해야 함.
const int iA(0); // 상수는 반드시 선언과 동시에 초기화
int iB(10);
iA=iB; // 오류, iA==10 상수이므로 대입할 수 없음
const는 읽기, 쓰기 모드에서 읽기 모드만 가능하게 변경시킴.
-
const int iA(0);
iA = 50; //쓰기 모드, 오류
연산자의 종류
- 산술 연산자(+, -, *, /, %)
- 관계 연산자(<. >, <=, >=, ==, !=)
- 논리 연산자(&&, ||, !)
- 비트 단위 연산자(&, |, ~, ^)
- 대입 연산자(=)
[산술 연산자]
- + , -, *, /
- % (나머지 연산자)
sizeof 연산자
: 자료형 또는 데이터의 크기를 구해주는 연산자
int iA(100);
char cA('D');
bool bA(false); //false를 작은/큰 따옴표로 묶어줘야되나 ?
float fA(10.f);
cout << sizeof(iA) << "\t";
cout << sizeof(cA) << endl;
cout << sizeof(bA) << "\t";
cout << sizeof(fA) << endl;
출력결과 :
4 1
1 4
[의문점]
cout << sizeof("안녕") << endl; // 5
? 출력값이 왜 5인가 ? 이렇게 써도 되는건가?
- sizeof는 널 포함 문자열의 길이 출력, 한글은 한 글자당 2byte. 즉, 널 포함 5byte
cout << sizeof(543) << sizeof("543") << endl; // 결과값은 둘 다 4
? 왜 4가 나오는가?, 숫자는 정수형과 문자열로써 바르게 읽어진건가?
- 543은 int형이니까 4byte, 543은 문자열로 널 포함 5 4 3 '\0' 각 1byte 총 4byte
* 컴퓨터는 0 나누기(divide zero)가 불가능
Divide Zero 불가능
cout << (4 / 0) << endl; //오류
cout << (4 % 0) << endl; //오류
나머지 연산자(%)는 '홀짝 구분'에 용의
cout << (2 % 2) << endl; // 0
cout << (3 % 2) << endl; // 1
cout << (4 % 2) << endl; // 0
[관계 연산자]
: 연산자를 기준으로 두 항의 대소 관계를 비교하여 참 또는 거짓으로 반환하는 연산자
- <, >, <=, >=
- == (같다)
- != (다르다)
----
[논리 연산자]
: 연산자를 기준으로 두 항의 논리 관계를 비교하여 참 또는 거짓으로 반환하는 연산자
- && (AND) : 둘 다 참일 떄 1
- || (OR) : 둘 중 하나만 참이어도 1
- ! (NOT) : 참을 거짓으로, 거짓을 참으로
&&(and)
-
cout << (0 && 1) << endl; // 0
cout << (1 && 0) << endl; // 0
cout << (1 && 1) << endl; // 1
||(or)
-
cout << (0 || 0) << endl; // 0
cout << (0 || 1) << endl; // 1
cout << (1 || 1) << endl; // 1
!(not)
-
bool bTrue = 1;
bool bFalse = false;
cout << (!bTrue) << endl; // 0
cout << (!bFalse) << endl; // 1
[비트 단위 연산자]
: 2진수로 치환된 상태에서 연산을 수행
- &
- |
- ~ (NOT) : 1은 0으로, 0은 1로
- ^ (XOR) : 값이 서로 다르면 참, 값이 같으면 거짓
bitset<>() 함수
1. 10진수를 2진수로 변환해주는 함수이다.
2. bitset<비트수>(변수/인자값)
3. #include <bitset> 을 해줘야 사용할 수 있다.
4. 연산속도가 빨라진다..
#include <iostream>
#include <bitset> //bitset함수를 사용하기 위해 <bitset> 헤더파일 포함
using namespace std;
void main(void){
int iA(15), iB(5);
cout << bitset<8>(iA) << "\t" << bitset<8>(iB) << endl; //정수 iA 와 iB가 8비트의 2진수로 변환됨
cout << "& : " << (iA & iB) << endl;
/* &는 둘 다 참인 경우만 참
00001111
00000101
---------
00000101
*/
cout << "| : " << (iA | iB) << endl;
/* |는 둘 중 하나만 참이어도 1
00001111
00000101
---------
00001111
*/
cout << "! : " << (~iA) << endl;
/* ~는 ~iA의 2의 보수값을 출력함 (1의 보수 + 1)
00001010 -> 11110101 (1의 보수)
11110101 + 1 -> 11110110 (2의 보수)
*/
cout << "^ : " << (iA^iB) << endl;
/* ^은 둘의 값이 다를 경우 참, 같을 경우 거짓
00001111
00000101
---------
00001010
*/
}
출력 결과 :
00001111 00000101
& : 00000101
| : 00001111
~ : 11110000
^ : 00001010
* 2진수로 따로 변환하지 않고 10진수인 채로 비트 단위 연산자를 사용할 경우,
10진수 -> (2진수 변환) -> (2진수 연산 실행) -> (10진수 변환) -> 10진수 결과값 출력
즉, 출력 결과는 // 128 64 32 16 8 4 2 1
00001111 00000101
& : 5
| : 15
~ : -16
^ : 10
[대입 연산자 (=)]
: 연산자를 기준으로 우항의 값을 좌항에 대입하는 연산자
: 컴퓨터는 오른쪽에서 왼쪽으로 가는 형식을 띈다.
*대입 연산자를 기준으로 좌항과 우항의 자료형은 반드시 일치해야 함
int iA(10), iB(20), iC(30);
iA = iB; // iA == 20이 됨
iC = iA; // iC == 20이 됨, iA가 20이 되었기 때문
iA = 0;
iC = iB = iA; // iA == 0 이므로 오른쪽에서 왼쪽으로 순서대로 대입
cout << iC << iB << iA << endl;
출력결과:
000
1의 보수, 2의 보수
보수 : 두 수의 합이 진법의 밑수가 되게 하는 수
ex) 10진수 4의 10의 보수는 6, 10진수 2의 10의 보수는 8
보수는 음수가 없는 컴퓨터에서 뺄셈을 하기 위해 만들어진 것으로,
A - B => A + (-B) // B의 보수를 구하여 덧셈으로 처리
[1의 보수]
: not 연산자 (~)를 붙인 값
- 10 -> 00001010 -> ~00001010 -> 11110101
1의 보수 뺄셈
- 빼는 수의 1의 보수를 구한 다음 더하기
- 덧셈한 결과가 최상위 비트에서 자리 올림이 생겼다면 최하위 비트에 1을 더하기
- 자리올림이 생기지 않았다면 연산 결과에 대해 1의 보수를 구한 후 - 부호 붙이기
[2의 보수]
: 1의 보수에 1을 더한 값
- 10 -> 00001010 -> ~00001010 -> 11110101 + 1 -> 11110110
2의 보수 뺄셈
- 빼는 수의 2의 보수를 구한 다음 더하기
- 덧셈한 결과가 최상위 비트에서 자리 올림이 생겼다면 자리 올림을 제외한 나머지 부분이 연산 결과
- 자리 올림이 생기지 않았따면 연산 결과의 2의 보수를 구한 후 - 부호 붙이기
의문점 / 실험
1. 논리연산자
- 0, 1 말고 다른 수, 변수로 되지 않을까 ?
2. bitset
- 인자값에 숫자, 변수, 문자가 들어가도 될까? 비트수는 변수로 넣어도 될까?
3. 대입 연산자
- iC = iB = iA; 형식으로 해도 될까 ?
- cout << ( iC == iB == iA); 가 될까 ?
'C++' 카테고리의 다른 글
| [TIL 5장] 3항 연산자, for문(이중 for문) (0) | 2022.08.01 |
|---|---|
| [TIL 4장] 반복문(feat. break, continue), 난수, time(), typedef (0) | 2022.07.29 |
| [TIL 3장] 형 변환, 증감/시프트 연산자, 분기문 (0) | 2022.07.27 |
| [TIL 1장] 연산 단위, 자료형 종류, 10 ↔ 2 진법 변환 (0) | 2022.07.26 |
| [TIL 0장] 개발 블로그 참고 및 운영 (0) | 2022.07.23 |