20210909_C++_공부기록
[2장 전체적인 기본개념]
- 변수 (Variable), 식별자(Identifier)
- 상수(constant)
- 데이터의 유형(자료형)
- 이진수와 십진수
- 숫자 데이터 유형 (정수/실수)
- 수 관련 연산자, 수식 계산과 연산자 우선순위
- 수의 형 변환, 증강 대입 연산자, 증강 연산자
1. 변수
프로그램에서 사용될 값을 저장하기 위해 사용. 값을 변경할 수 있기 때문에 변수라고 한다.
변수 선언 : 변수의 이름과 유형을 알려준다
int radius;
//int라는 변수 타입(유형) radius라는 변수 이름
int i = 1, j = 2;
//변수 i에 1을 저장(초기화라고 함)
//선언과 동시에 초기화 가능
//연달아 같은 타입으로 초기화 가능
2. 식별자
식별자(Identifier) : 변수나 함수의 이름이다.
3. 상수
변수와 다르게 프로그램이 실행하는 동안 변경되지 않는다.
상수는 선언과 초기화가 한 문장에서 이루어져야 함. (관습상 대문자로 작성)
4. 데이터 유형(자료향)
가장 큰 틀인 정수형은 int, 실수형은 double 이다.
오늘 2장에서 다루는 것은 숫자 데이터 유형인 정수형과 실수형이다.
+)
논리형 : 물음의 값이 True 와 False 두가지로 처리되는 자료형
5. int(정수)
정수는 내부적으로 이진수로 저장된다.
N비트를 가지고 표현할 수 있는 수 : 0 ~ 2**n-1
(최대 2**n개를 표현할 수 있는데 0부터 시작하니까 1을 빼준다.)
6. 이진수와 십진수
십진수는 우리가 평소에 사용하는 숫자. 0~9를 사용하여 값을 표현.
이진수는 0과 1 두 개의 숫자를 이용하여 값을 표현한다.
-십진수를 이진수로 변환
10진수를 각 진법의 수로 나누면서 나머지를 차례로 적는다.
-2진수와 8진수/16진수
7. int(정수)의 양수/음수 표현
8bit = 1byte 중에서 맨 앞에 1bit는 부호를 결정하는 자리(부호비트)이기 때문에
실질적으로는 7bit밖에 쓰지 못함. (정수의 양수, 음수 표현이지 int가 1byte란 소리는 아니다)
양수 : 0 ~ 2**(7-1)
음수 : -2**(7-1) ~ -1
8. double과 float (실수)
소수점을 사용하여 실수를 표현하며, doube형이 float의 두 배의 크기이기 때문에 더 정확하다.
-부동소수점(floating-point number)
컴퓨터는 내부적으로 지수표기법(과학적기수법)을 사용한다.
지수표기법을 정규화라고도 한다.
점 앞에 숫자(1-9)를 한 개만 놓고 나머지는 다 점 뒤로 놓은 다음에 옮겨진 만큼 10의 거듭제곱을 곱하는 것이다.
float형 : 32비트가 부호부(1), 지수부(8), 가수부(23)으로 나뉘어져 있음.
즉 4byte이다.
double형 : 32비트가 부호부(1), 지수부(11), 가수부(52)으로 나뉘어져 있음.
즉 8byte로 float형보다 정밀도가 높다.
예시) 6.75를 정규화를 해라
6은 이진수로 0110
2**3 | 2**2 | 2**1 | 2**0 | . | 2**−1 | 2**−2 | 2**−3 | 2**−4 |
1 | 0 | 0 | 1 | . | 1 | 1 | 0 | 1 |
1×8 | 0×4 | 0×2 | 1×1 | . | 1×1/2 | 1×1/4 | 0×1/8 | 1×1/16 |
2진수로 나타낼 때, 2의 3제곱 / 2의 2제곱 / 2의 1제곱 / 0 / 2의 -1제곱 / 2의 -2제곱 ······ 이런식으로 됨.
0과 1이니까 십의 자리 수면 0이나 1을 두 자리수에 넣을 수 있으니까 2의 2제곱 이런식임.
0을 기준으로 오른쪽은 -1,-2 이렇게 -가 붙음.
-1제곱은 크기가 0.5 , -2제곱은 크기가 0.25
6.75에서 .75는 -1제곱 0.5 + -2제곱의 0.25를 더한 값이니까
.75는 .11로 표현할 수 있다.
즉, 6.75는 110.11로 2진수 변환
정규화는 소수점 앞에 숫자 하나만 남겨놓으니까 1.1011 * 10**2 (지수표기법 : 1.1011e2)
부호에는 양수니까 0
지수부에는 2제곱이니까 2
가수부에는 1011
+) 이걸 다시 복원하는 과정
1. 가수부를 가져온다
2. 숫자 하나를 남기고 소수점을 붙인다.
3. 지수부 숫자를 가져와서 (10의 ?제곱) ?에 넣는다.
9. 숫자 데이터 유형 (정수/실수)
이름 | 같은 표현 | 범위 | 저장 공간 크기 |
short | short int | -2**15 ~ 2**15-1 (-32,768 ~ 32,767) (int형의 절반이다. 16bit) |
16bit signed |
unsingned short | unsingned short int | 0 ~ 2**16-1 (66535) | 16bit unsingned |
int (정수) | -2**31 ~ 2**31-1 (int는 4byte, 즉 32bit) | 32bit signed | |
unsingned | unsingned int | 0 ~ 2**32-1 (4294967295) | 32bit unsigned |
long | long int | -2**31 ~ 2**31- 1 (-2147483648 ~ 2147483647) | 32bit signed |
unsingned long | unsingned long int | 0 ~ 2**32-1(4294967295) | 32bit unsigned |
float (실수) | 음수 범위: -3.4028235E+38 ~ -1.4E-45 양수 범위: 1.4E-45 ~ 3.4028235E+38 |
32bit IEEE 754 | |
double (실수) | 음수 범위: -1.7976931348623157E+308 ~ -4.9E-324 양수 범위: 4.9E-324 ~ 1.7976931348623157E+308 |
64bit IEEE 754 | |
long double | 음수 범위: -1.18E+4932 ~ 3.37E-4932 양수 범위: 3.37E-4932 ~ 1.18E+4932 유효숫자 길이: 19 |
80bit |
* unsingned : 부호없음
* 정수로 커버 못하는 수는 대부분 double로 선언. int에 하면 overflow발생 확률 높음.
* 커버를 할 수 있는 컴파일러가 있고 할 수 없는 컴파일러가 있음.
10. 수 관련 연산자
여기서는 / 만 주의하면 된다.
/ 는 몫을 구한다.
1 / 2 = 0 : 정수의 나눗셈
1.0 / 2.0 = 0.5 : 실수의 나눗셈
11. 수의 형 변환
- 아래의 코드처럼 암시적인 형변환이 가능하다.
int i = 34.7; //유형축소 i=34
double f = 34.7; //유형확대 f=34.7
- 정수와 실수가 연산에 섞여있다면, 정수는 실수로 자동변환됨.
3 * 4.5 // 3.0 * 4.5 로 계산됨.
- 형변환 연산자 static_cast<> 를 명시적으로 사용할 수도 있다.
cout << static_cast<int>(1.7); //1이 출력된다.
cout << static_cast<double>(1)/2; //0.5가 출력된다.
//double형에서 1이 1.0으로 바뀐다.
- 형변환에 의해 변수의 유형이 변경되지는 않는다.
double d = 4.5;
int i = static_cast<int>(d)
//i는 4, d는 4.5
12. 증강 대입 연산자
연산자 | 예 | 동일한 표현 |
+= | i += 8 | i = i + 8 |
-= | i -= 8 | i = i - 8 |
*= | i *= 8 | i = i * 8 |
/= | i /= 8 | i = i / 8 |
%= | i %= 8 | i = i % 8 |
13. 증감 연산자
연산자 | 이름 | 설명 | 예(i = 1로 가정) |
++var | 전위 증가 | var의 값을 1만큼 증가 시킨 후, 문장에서 새로운 값의 var를 사용 |
int j = ++i; // j는 2, i는 2 |
var++ | 후위 증가 | var의 값을 1만큼 증가 시키지만, 문장에서는 증가시키기 전의 원래 var 값을 사용 |
int j = i++; // j는 1, i는 2 |
--var | 전위 감소 | var의 값을 1만큼 감소 시킨 후, 문장에서 새로운 값의 var를 사용 |
int j = --i; // j는 0, i는 0 |
var-- | 후위 감소 | var의 값을 1만큼 감소 시키지만, 문장에서는 감소 시키기 전의 원래 var 값을 사용 |
int j = i--; // j는 1, i는 0 |
[실습]
실습 1. 원의 면적 계산
//원의 면적 계산
#include <iostream>
using namespace std;
int main()
{
int radius;
double area;
radius = 20;
area = radius * radius * 3.14159;
cout << "원의 면적은 :" << area << endl;
return 0;
}
//원의 면적은 :1256.64
실습 2. 원의 면적 계산 + 3.14값을 상수로 저장
//위의 실습과 다르게 파이값을 상수로 설정
#include <iostream>
using namespace std;
int main()
{
const double PI = 3.14159;
double radius;
cout << "반지름을 입력하세요 : ";
cin >> radius;
double area = radius * radius * PI;
cout << "원의 면적은 :" << area << endl;
return 0;
}
//반지름을 입력하세요 : 3
//원의 면적은 :28.2743
실습 3. 수 관련 연산자 (/ % 연습)
#include <iostream>
using namespace std;
int main()
{
int seconds;
cout << "초를 정수로 입력해주세요 ; ";
cin >> seconds;
int minutes = seconds / 60; //분을 구함 - 몫
int remainingSec = seconds % 60; //남은 초를 구함 - 나머지
cout << minutes << "분" << remainingSec << " 초 입니다. \n";
return 0;
}
//초를 정수로 입력해주세요 ; 470
//7분50 초 입니다.
실습4. 수식 계산과 연산자 우선순위
화씨를 섭씨로 변경하는 프로그램
* celsius를 상수로 정의할 때 정수를 실수로 써야하는데 그냥 정수로 써서
프로그램을 돌리는데 계속 0이 나왔다. 그래서 감점을 당했다. 주의해야겠다.
#include <iostream>
using namespace std;
int main()
{
double fahrenheit;
double celsius;
cout << "온도를 화씨로 입력하시오:";
cin >> fahrenheit;
celsius = (5.0 / 9.0) * (fahrenheit - 32) ;
cout << "화씨온도" << fahrenheit << "는" <<
"섭씨온도로" << celsius << "입니다." << endl;
return 0;
}
//온도를 화씨로 입력하시오:60
//화씨온도60는섭씨온도로15.5556입니다.
실습5. 증강 대입 연산자
#include <iostream>
using namespace std;
int main()
{
int a = 10, b = 2;
double c = 12.0;
a += b;
cout << "a = " << a << endl; //a=12
a -= b;
cout << "a = " << a << endl; //a=10
//위에서 a += b를 했기 때문에 a=12인 상태에서 계산됨.
c /= 2 + 5 *2.0;
cout << "c = " << c << endl; //c=1
// /= 뒤에서 계산을 전부 한 다음에 c를 나눈다.
return 0;
}
//a = 12 a = 10 c = 1
실습6. 증감 연산자
#include <iostream>
using namespace std;
int main()
{
int x = 1;
int y = 5;
x++; //x=2
y--; //y=4
int z = x-- + (++y); //y=5 z=7 x=1
cout << " x = " << x << " y = " << y << " z = " << z << endl;
return 0;
}
// x = 1 y = 5 z = 7
'School Study > 2021-2' 카테고리의 다른 글
[week 04] C++ 복습_3장 선택문 (2) (0) | 2021.10.16 |
---|---|
[week 03] C++ 복습_3장 선택문 (1) (0) | 2021.10.07 |
[week 02] 미벡 기초 복습 (벡터와 벡터공간) (0) | 2021.09.29 |
[week 01] C++ 복습 (컴퓨터, 프로그래밍 및 C++ 입문) (0) | 2021.09.23 |
[week 01] 미벡 기초 (데이터의 형식과 기본 연산) (0) | 2021.09.01 |