본문 바로가기

C++

[TIL 2장] 표기법, 상수, 연산자 종류, 보수, sizeof(), bitset<>(), 보수

오늘의 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); 가 될까 ?