본문 바로가기

C++

[TIL 1장] 연산 단위, 자료형 종류, 10 ↔ 2 진법 변환

오늘의 TIL 목차 (22.07.25)

 

  • 변수, 선언, 정의, 초기화의 정의
  • 연산의 단위, 8bit = 1byte
  • 자료형의 종류 ( 정수, 실수, 문자, 논리자료형)
  • 진수 종류, 10진수 ↔ 2진수 진법 변환
  • cin, cout을 이용한 성적 입출력

단어 정의


  • 변수 : 변하는 수 (변하는 수를 넣는 그릇처럼 사용됨)
  • 선언 : '변수를 선언하다'라고 말하며 숫자를 저장하기 위한 메모리 공간을 할당하는 것
  • 초기화 : 메모리 공간을 할당받음과 동시에 사용자가 원하는 값으로 채워서 빌려오는 행위
  • 선언과 동시에 초기화(변수 정의)를 생활화할 것. (선언만 한다면 변수에 쓰레기값이 들어감)
int iA; // 선언
iA = 0 // 정의
-
int iA = 0; // 초기화
int iA(0); // C++ 방식의 변수 초기화

연산의 단위


  • 연산의 최소 단위 : 1bit
  • 저장의 최소 단위 : 1byte

1bit → 1byte → 1KB → 1MB → 1GB → 1TB (단위가 올라갈수록 2^10씩 차이)

 

* 8bit = 1byte

 

자료형의 종류


자료형 : 변수의 종류

1. 정수형    2. 실수형    3. 문자     4. 논리자료형

[정수 자료형]

  • short (2byte)
  • int (4byte) - 주로 사용
  • long (4byte)
  • long long (8byte)

unsigned 기호 특징

  • 정수 자료형은 기본적으로 앞에 singed가 생략되어 있다. (음수 ~ 양수)
  • 0 ~ 양수(양수 표현 범위 2배)를 표현하고 싶을 경우, 앞에 unsinged를 무조건 붙여야 한다.
  • 정수 타입의 자료형에만 붙여서 표기할 수 있다. (char 포함)
short sA = 32768; // signed short = -32768 ~ +32767
unsigned short sB = 32768; // unsigned short = 0 ~ 65535 (0부터 양수까지)
cout << sA << '\n' << sB << endl; // endl(='\n')

//출력 결과:
-32768
32768

// signed short의 경우 숫자를 초과하며 잘못된 결과값을 출력한다.
// unsigned를 앞에 붙여야지만 양수 전체를 출력할 수 있으면서 제대로 된 결과값을 출력한다.

[실수 자료형]

  • float (4byte) - 게임 개발 99% float 사용
  • double (8byte)
  • long double (8byte)
  • 컴파일러는 소수점 이하의 수를 기본적으로 double형으로 인식하여 저장한다.
  • 소수점 이하를 가진 수 뒤에 f를 붙이게 되면 float형으로 인식하여 저장한다.
float fPi = 3.14f;
float fTemp = 5.f; // n.0의 경우 n.f로 가능

cout << fPi << endl << fTemp << endl;

/* 출력결과
3.14
5
*/

/* 삽질
double fNum = 3f; //double에서 float형으로 짤린다는 경고
float fPi = 3.14; //출력은 정상적이나 뒤에 f를 붙여주자
*/

[문자 타입의 자료형]

  • char (1byte) // -128 ~ 127 , 0 ~ 255
  • 영어 단문자만 출력, 작은따옴표{')로 구분
  • 변수에 숫자를 넣을 경우, 아스키코드값에 따라 변환되어 출력됨
  • 아스키코드는 65 → A, 97 → a 등 영어와 여러 기호를 포함
char cNum = 97;
char cEng = 'A';

cout << cNum << endl;
cout << cEng << endl;

/* 출력결과
a
A
*/

/* 삽질
char cString = 'ABCD'; 의 출력값은 D
큰따옴표는 오류가 뜨지만 작은따옴표로 한다면
가장 끝에 있는 영어 단문자가 출력된다.
*/

[논리자료형] : 참 또는 거짓을 저장하는 용도의 자료형

  • bool (1byte)
  • 0을 제외한 모든 값을 1로 간주 ( true, false, 숫자를 제외한 경우 참으로 출력되나 경고)
bool bTrue = 4; // 0을 제외한 모든 수는 참, 0.000001도 참
bool bFalse = false; // true, false로 대입하는 게 best

cout << bTrue << endl << bFalse << endl;

/* 출력결과
1
0
*/

/* 삽질
bool bChar = "안녕하세요"; 의 출력값으로 1 (=참)이 나오지만 부적절한 사용
*/

 

10진수 ↔ 2진수 진법 변환


  • 2진수 : 0, 1 → 00 01 10 11
  • 10진수 : 0~9 → 10 11 ,, 19 20
  • 8진수 : 0~7 → 10 11 ,, 17 20
  • 16진수 : 0~9, A, B, C, D , E, F(15) → 10 11 ,, 1F 20

 

  • int iA(10); 초기화 시 iA라는 이름의 정수형 메모리 (4byte = 32bit)에 10이 저장된다.
  • 이때, 10은 000,,,1010의 2진수 형태로 저장된다.

 

10진수 → 2진수 치환

: 10진수를 더 이상 나눠지지 않을 때까지 2로 나눈 후 각 나눈 몫의 나머지를 역방향으로 적는다.

 

2진수 → 10진수 치환

: 8bit 기준 11111111의 각 자릿수는 2^7, 2^6, 2^5, 2^4, 2^3, 2^2, 2^1, 2^0 즉, 128 64 32 16 8 4 2 1 이다.

00001010 → 8 + 2 = 10

 

입출력 cin, cout


  • cin과 cout은 C++에서 각각 '입력'과 '출력'을 담당
  • 시프트 연산자(<<, >>)를 사용하여 입출력 실행

Code. 국어, 영어, 수학 점수 입출력

#include <iostream> // 컴파일 전에 헤더파일 포함시키기

using namespace std; // std 라이브러리 안에 cin, cout

int iKor(0), iEng(0), iMath(0); // C++ 초기화 방식

cout << "국어, 영어, 수학 점수를 차례로 입력하시오 : "; // cout은 왼쪽 시프트 연산자(<<) 사용
cin >> iKor >> iEng >> iMath // cin은 오른쪽 시프트 연산자(>>) 사용, endl 사용 불가능

cout << "국어\t 영어\t 수학\t" << endl; // \t는 탭키만큼 띄어쓰기 (이스케이프 시퀀스 : \n과 같은 특수문자)
cout << iKor << "\t" << iEng << '\t' << iMath << endl; // 이스케이프 시퀀스는 (',") 상관 없음

/* 출력결과
국어, 영어, 수학 점수를 차례로 입력하시오 : 20 30 50
국어	영어	수학
20	30	50
*/

 

의문점

 

1. [논리자료형]

bool bChar = "안녕하세요"; 의 경우 출력 결과가 1 (=참) 으로 나온다.

경고창이 안 뜨는 걸 봐서 숫자가 아닌 값이 들어가도

부적절하지 않게 참으로 출력할 수 있는 것인가?

 

2.[입출력 cin, cout]

int iA(10), iB(20), iC(30);

cout << iA << iB << iC << endl; 의 출력 결과는 102030이다.

10 20 30으로 띄어쓰고 싶을 경우,

cout << iA << " " << iB << " " << iC << endl; 밖에 안되는가?