
A. 기본 자료형(data type)
1. 기본 자료형
a. 자료형이란?
🌟 해당 데이터가 메모리에 어떻게 저장되고, 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려주는 역할
기본 자료형: C 언어에서 미리 여러 형태의 타입을 작성하여 제공하는 것 (타입 = 기본 자료형)
이러한 기본 자료형은 아래와 같이 나눌 수 있음
b. 정수형 타입
정수 : 부호를 가지고 있고, 소수 부분이 없는 수
🌟 대표적으로 short, int, long
정수형 타입 | 할당되는 메모리 크기 | 데이터의 표현 범위 |
(signed) short | 2 바이트 | - 32,768 ~ 32,767 / 대략 -+3만 |
unsigned short | 2 바이트 | - 0 ~ 65,535 |
(signed) int | 4 바이트 | - 2,147,483,648 ~ 2,147,483,647 / 대략 -+21억 |
unsigned int | 4 바이트 | - 0 ~ 4,294,967,296 |
(signed) long | 4 바이트 | - 2,147,483,648 ~ 2,147,483,647 |
unsigned long | 4 바이트 | - 0 ~ 4,294,967,296 |
🧡 unsigned 키워드
부호를 나타내는 최상위 비트(MSB, Most Significant Bit)까지도 크기를 나타내는 데 사용
즉, 음수를 표현할 부분을 포기하는 대신, 두배로 양의 정수를 표현할 수 있게 됨
반대인 signed 키워드는 모든 타입에서 기본적으로 생략되어 있는 것
💙 최상위 비트(MSB, Most Significant Bit)란?
1바이트를 구성하는 8개의 비트 중 최고값을 갖는 비트를 의미
🧡 오버플로우(overflow)
해당 타입이 표현할 수 있는 최대 범위보다 큰 수를 저장할 때 발생하는 현상
오버플로우가 발생하면 최상위 비트(MSB)를 벗어난 데이터가 인접 비트를 덮어쓰므로, 잘못된 결과를 얻음
반대인 언더플로우(underflow) : 해당 타입이 표현할 수 있는 최소 범위보다 작은 수를 저장할 때 발생하는 현상
🤓 예제 :
#include <iostream>
using namespace std;
int main()
{
int num = 2147483647;
cout << "변수 num에 저장된 값은 " << num << "입니다." << endl;
num = 2147483648;
cout << "변수 num에 저장된 값은 " << num << "입니다." << endl;
return 0;
}
✨ 실행결과
변수 num에 저장된 값은 2147483647입니다.
변수 num에 저장된 값은 -2147483648입니다.
💙 데이터 처리 속도
정수형 중에서도 int형의 데이터를 가장 빠르게 처리해 보편적으로 크기에 상관없이 int형을 가장 많이 사용
(16bit라면 2바이트, 32bit이상부터 4바이트)
c. 실수형 타입
실수 : 소수부나 지수가 있는 수를 가리키며, 정수보다 훨씬 더 넓은 표현 범위를 가짐
하드웨어의 발달로 인한 메모리 공간의 증가로 현재에는 double형을 가장 많이 사용
🌟 대표적으로 float, double
실수형 타입 | 할당되는 메모리 크기 | 데이터의 표현 범위 |
float | 4 바이트 | (3.4 X 10-38) ~ (3.4 X 1038) 소수 부분 6자리까지 오차없이 표현 |
double | 8 바이트 | (1.7 X 10-308) ~ (1.7 X 10308) 소수 부분 15자리까지 오차없이 표현 |
long double | double형과 동일함. | double형과 동일함. |
🤓 예제 : 소수점을 16자리 가지는 실수를 float형과 double형 변수에 각각 대입
#include <iostream>
using namespace std;
int main()
{
cout << fixed; // 소수점의 자릿수를 고정해서 표현함.
cout.precision(20); // 소수점의 자릿수를 20으로 설정함.
float num01 = 3.1415926535897932; // float 타입의 유효 자릿수는 소수점 6자리
cout << "변수 num01에 저장된 값은 " << num01 << "입니다." << endl;
double num02 = 3.1415926535897932; // double 타입의 유효 자릿수는 소수점 16자리
cout << "변수 num02에 저장된 값은 " << num02 << "입니다." << endl;
return 0;
}
✨ 실행결과
변수 num01에 저장된 값은 3.14159274101257324219입니다. //7점자리 부터 오류
변수 num02에 저장된 값은 3.14159265358979311600입니다. //16자리 부터 오류
💥 WARNING
컴퓨터에서 실수를 표현하는 방식은 반드시 오차가 발생하는 기술적 한계
이러한 실수형 데이터의 오차는 C언어뿐만 아니라 모든 프로그래밍 언어에서 발생하는 공통된 문제임
d. 문자형 타입
문자형 데이터 : 문자 하나를 표현할 수 있는 타입을 의미
🌟 대표적으로 char
문자형 타입 | 할당되는 메모리의 크기 | 데이터의 표현 범위 |
(signed) char | 1 바이트 | 2^7 ~ 2^7-1 |
unsigned char | 2 바이트 | 0 ~ 2^8 |
컴퓨터가 문자를 표현해야 하는데 문자가 숫자로 대응되는 인코딩 방식이 대표적으로 아스키코드
👉 아스키코드의 공부하기
[문자 표현의 이해] 아스키코드(ASCII)와 유니코드
💙 배경지식 컴퓨터 내부는 전기 신호로 작동하는 스위치인 트랜지스터가 존재 전기 신호가 있으면 1, 없으면 0 즉, 컴퓨터는 트랜지스터를 통해 사용자가 입력한 데이터를 0과 1로 처리 비트 : 0
monamu.tistory.com
e. bool 형 타입
🌟 참(true)이나 거짓(false) 중 한 가지 값만을 가질 수 있는 불리언 타입
✔ C++11에서 추가된 타입
✔ 어떤 값도 bool형으로 묵시적 타입 변환이 가능
✔ 0인 값은 거짓(false)으로, 0이 아닌 값은 참(true)으로 자동 변환
f. auto 키워드
🌟 변수의 초기화 값에 맞춰 변수의 타입을 추론할 수 있는 키워드
👉 즉, 변수를 초기화할 때 특정 타입을 명시하는 대신에, auto 키워드를 사용하여 초깃값에 맞춰 타입이 자동으로 선언
🧡 auto 키워드의 재정의
기존의 auto 키워드 : 자동 저장소 클래스에 있는 지역 변수를 선언하는 데 사용되는 기억 클래스 지정자
하지만 사용하는 의미가 없어 거의 사용하지 않음
C++11부터 재정의해 변수 선언시 초깃값과 같은 타입으로 변수를 선언할 수 있도록 함
B. 실수의 표현
2진수로만 표현해야 하기 때문에 실수를 표현하는 방식은 정수보다 복잡함하고
실수형 타입에서 설명했듯, 실수를 표현하는 방식은 반드시 오차가 발생하는 기술적 한계가 존재함
현재는 고정, 부동 소수점 방식을 사용함
1. 실수의 표현
a. 고정 소수점(fixed point) 방식
실수를 정수부, 소수부로 나누고 소수부의 자릿수를 미리 정해놓고, 고정된 자릿수로 소수를 표현하는 것
정수부와 소수부의 자릿수가 크지 않으므로, 표현할 수 있는 범위가 매우 적다는 단점이 있음
32비트 실수를 고정 소수점 방식으로 표현하면 다음과 같음
b. 부동 소수점(floating point) 방식
실수를 가수부와 지수부로 나누어 표현
고정 소수점 방식과 다르게 매우 큰 실수까지도 표현할 수 있게 됨
👉 대부분의 시스템에서 이용하는 방식
2. 부동 소수점
a. 부동 소수점 표현 방식
1) 소수부분을 아라비아 숫자로 표현
2) e 또는 E를 사용해 표현
b. 부동 소수점 방식
🌟 IEEE 부동 소수점 방식
현재 사용되고 있는 부동 소수점 방식은 대부분 IEEE 754 표준을 따름
c. 부동 소수점 방식의 오차
고정 소수점 방식보다 훨씬 더 많은 범위까지 표현하지만,
부동 소수점 방식에 의한 실수의 표현은 항상 오차가 존재한다는 단점이 있음
오차는
이 공식때문에 발생하는데,
이 공식을 사용하면 표현의 범위는 늘어나지만, 10진수를 정확하게 표현할 수는 없게 되기 때문
따라서 컴퓨터에서 실수를 표현하는 방법은 언제나 근사치를 표현한다
➡ 모든 프로그래밍 언어에서 발생하는 기본적인 문제
🤓 예제
int i;
float sum = 0.1;
for (i = 0; i < 1000; i++)
{
sum += 0.1;
}
cout << "0.1을 1000번 더한 합계는 " << sum <<"입니다.";
✨ 실행결과
0.1을 1000번 더한 합계는 100.099045입니다
💥 100이여야 하는데 오차가 난 모습
출처 : http://www.tcpschool.com/cpp/cpp_datatype_basic
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
http://www.tcpschool.com/cpp/cpp_datatype_floatingPointNumber
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
'프로그래밍 언어 > C++' 카테고리의 다른 글
[게임 프로그래머 입문 올인원] 데이터와 로직 : 연산 (6, 7강) (4) | 2023.09.05 |
---|---|
C++ 자료형의 타입 변환 (0) | 2023.09.05 |
C++ 상수 총정리 (0) | 2023.09.05 |
[게임 프로그래머 입문 올인원] 데이터와 로직 : 변수, 상수 (3, 4, 5강) (2) | 2023.09.02 |
[게임 프로그래머 입문 올인원] 데이터와 로직 : 프로그래밍 개론 (2강) (0) | 2023.09.02 |