본문 바로가기
C++/뇌를 자극하는 C++

[C++] 챕터 5 - 타입 1 : 정보의 종류

by Minkyu Lee 2023. 4. 20.

// 예제 5-1 : 6가지 정수 타입의 범위 실험

int main()
{
	short int si;
	unsigned short int usi;
	int i;
	unsigned int ui;
	long int li;
	unsigned long ul; // int가 없음에 주의
	
	// 작은 값
	si = 40000; // error
	usi = 40000; // 이하 ok
	i = 40000;
	ui = 40000;
	li = 40000;
	ul = 40000;

	// 조금 더 큰 값
	si = 70000; // error
	usi = 70000; // error
	i = 70000; // 이하 ok
	ui = 70000;
	li = 70000;
	ul = 70000;

	// 더 큰 값
	si = 2200000000; // 이하 error 
	usi = 2200000000;
	i = 2200000000;
	ui = 2200000000; 
	li = 2200000000; // 이하 ok
	ul = 2200000000;

	// li, ul의 한계 파악 (43억) cpp기본 타입으로는 보관불가
	li = 4300000000;
	ul = 4300000000;

	// 음수
	si = -100; //ok
	usi = -100; // error
	i = -100; // ok
	ui = -100; // error
	li = -100; // ok
	ul = -100; // error

	return 0;
}

/*
에러가 안뜬다.
이후에 필히 확인해야한다.
특히 음수값 오류가 안뜬다.
*/

 

// 예제 5-2 : 타입의 크기 알아보기

#include <iostream>
using namespace std;

int main()
{
	cout << "short int : " << sizeof(short int) << " bytes\n";
	cout << "unsigned short int : " << sizeof(unsigned short int) << " bytes\n";
	cout << "int : " << sizeof(int) << " bytes\n";
	cout << "unsigned int : " << sizeof(unsigned int) << " bytes\n";
	cout << "long int : " << sizeof(long int) << " bytes\n";
	cout << "unsigned long int : " << sizeof(unsigned long int) << " bytes\n";

	return 0;
}

/*
unsigned long int라고 적혀있다.
이전은 int가 빠졌는데 책 오타인듯하다.
확인 필요.

// 갤럭시북 기준 결과
2 바이트
2 바이트
4 바이트
4 바이트
4 바이트
4 바이트

*/

 

// 예제 5-3 : 10, 8, 16진수의 사용

 

#include <iostream>
using namespace std;

int main()
{
	// 10, 8, 16진법 사용
	int decimal = 41;
	int octal = 041;
	int hexadecimal = 0x41;

	cout << "41	= " << decimal << "\n";
	cout << "041	= " << octal << "\n";
	cout << "0x41	= " << hexadecimal << "\n";

	return 0;
}

/* 결과
41      = 41
041     = 33
0x41    = 65
*/

 

// 예제 5-4 : 실수 타입의 사용

C++에서는 실수 뒤 f가 '없으면', double 값이라고 생각한다.

 

int main()
{
	float f;
	double d;
	long double ld;

	// 대입1
	f = 0.00123f;
	d = 1.23;
	ld = 123.0;

	// 대입2 : 지수
	f = 1.23E-3f;
	d = 1.23E0;
	ld = 1.23E2;

	return 0;
}

/*
float에 f를 지우면 double값으로 인식하고, float으로 형변환하면서 잘린다. warning 발생.
*/

 

// 예제 5-5 : char 타입의 사용

#include <iostream>
using namespace std;

int main()
{
	char a;
	char b;
	char c;

	a = 'G';
	b = 'O';
	c = 'D';

	cout << a << b << c << "\n";
}

/*
문자는 작은따옴포사용
문자열은 큰따음표사용

char은 보통 1바이트
ASCII 약속사용 (American Standard Code for Information Interchange)
*/

 

// 예제 5-6 : 아스키 코드 값 확인

 

#include <iostream>
using namespace std;

int main()
{
	int a = 'A';
	cout << a << "\n";

	char b = 65;
	cout << b << "\n";

	return 0;
}
/*
65
A
로 결과가 나온다.

A의 아스키코드는 65이다.
같은 65가 int냐 char에 따라 해석이 달라지는 것이다.
*/

 

// 예제 5-7 : 이스케이프 문자열 사용

#include <iostream>
using namespace std;

int main()
{
	cout << "Hello, Works";
	cout << "\b\b";
	cout << "ld!\n";

	return 0;
}

/*
백스페이스 두번으로 뒤를 지운다.
*/

 

// 예제 5-8 : bool 타입 사용

#include <iostream>
using namespace std;

int main()
{
	bool b1;
	bool b2;
	b1 = true;
	b2 = false;

	cout << "b1 = " << b1 << "\n";
	cout << "b2 = " << b2 << "\n";

	return 0;
}

/*
bool의 실제 보관값은 정수이다.
다만 타입에 따라 해석이 달라진 것 뿐이다.
*/

 

// 예제 5-9 : 기본 타입간의 형변환

 

#include <iostream>
using namespace std;
int main()
{
	int i = 65;
	float f = 66.89f;
	char c = 'C';
	bool b = true;

	// 형변환할 변수 미리 정의
	int f2i, c2i, b2i;
	float i2f, c2f, b2f;
	char i2c, f2c, b2c;
	bool i2b, f2b, c2b;

	// int를 다른 타입으로
	i2f = i; // int -> float
	i2c = i;
	i2b = i;

	// float ...
	f2i = f; // float -> int
	f2c = f;
	f2b = f;

	// char ...
	c2i = c; // char -> int
	c2f = c;
	c2b = c;

	// bool ...
	b2i = b; // bool -> int
	b2f = b;
	b2c = b;

	// 출력
	cout << f << "\n" << f2c; // 간단하게 형변환 확인

	return 0;
}
/*
bool로 형변환시 0이 아닌 수는 모두 1이다.
char로 형변환시 값의 변화 발생치 않는다. (소수는 소수점 이하는 잘리고 정수로 인식)
*/

 

// 예제 5-10 : 문제가 생기는 형변환

큰 타입에서 작은 타입으로의 형변환의 문제가 핵심이다.
실습은 스킵하였다.

댓글