자료형으로 변수의 저장 자리를 확보하고 할당.
🔷C++의 주요 자료형
자료형 | 크기(일반적인 경우) | 값의 범위 또는 내용 | 예시 값 | |
정수형 | short | 2 byte | -32,768 ~ 32,767 | short a = 10; |
int | 4 byte | -2,147,483,648 ~ 2,147,483,647 | int b = 100; | |
long | 4 or 8 byte | 플랫폼에 따라 다름 | long c = 1000; | |
long long | 8 byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
long long d = 1000000; | |
unsigned | 자료형 크기 동일 | 0 이상 정수만 저장 가능 | unsigned int e = 200; | |
실수형 | float | 4 byte | 약 ±3.4 × 10⁻³⁸ ~ ±3.4 × 10³⁸ | float f = 3.14f; |
double | 8 byte | 약 ±1.7 × 10⁻³⁰⁸ ~ ±1.7 × 10³⁰⁸ | double g = 3.141592; | |
long double | 8, 12, 16 byte | 플랫폼에 따라 다름 | long double h = 3.141592653589793; | |
문자형 | char | 1 byte | ASCII 문자 저장 가능 | char i = 'A'; |
wchar_t | 2 or 4 byte | 유니코드 문자 저장 가능 | wchar_t j = L'한'; | |
char16_t | 2 byte | UTF-16 문자 저장 가능 | char16_t k = u'字'; | |
char32_t | 4 byte | UTF-32 문자 저장 가능 | char32_t l = U'字'; | |
논리형 | bool | 1 byte | true 또는 false | bool m = true; |
포인터형 | 포인터형 | 메모리 주소 저장 | ||
int* | 4 or 8 byte | 정수를 가리키는 포인터 | int* p = &b; | |
void* | 4 or 8 byte | 아무 자료형이나 가리킬 수 있음 | void* q = &b; | |
기타 | void | 0 byte | 반환값이 없음 | void func(); |
auto | 변수 타입 자동 추론 | 컴파일러가 자료형을 결정 | auto r = 42; | |
decltype(x) | x의 타입을 반환 | 컴파일 시점 타입 결정 | decltype(b) s; |
🔷 정수 자료형 (Integer Types) 정리
📌 C++ 정수형 자료형
자료형 | 크기 | 범위 |
char | 1바이트 | -128 ~ 127 (signed) or 0 ~ 255 (unsigned) |
short | 2바이트 | -32,768 ~ 32,767 |
int | 4바이트 | -2,147,483,648 ~ 2,147,483,647 |
long | 4바이트 | -2,147,483,648 ~ 2,147,483,647 |
long long | 8바이트 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
🛠 char 자료형 상세 분석
🔷 1. char는 문자 자료형이지만, 사실은 정수형이다!
✔ char는 문자(character)를 저장하지만 내부적으로 정수 값(ASCII 코드)을 저장
✔ 예) 'A'는 ASCII 코드 65로 저장됨
✔ 숫자처럼 연산 가능 ('A' + 1 → 'B', 즉 66)
🔷 2. char의 종류
자료형 | 크기 | 범위 | 특징 |
char | 1바이트 | -128 ~ 127 또는 0 ~ 255 | 시스템마다 signed 또는 unsigned 다름 |
signed char | 1바이트 | -128 ~ 127 | 기본적으로 char와 동일한 경우 많음 |
unsigned char | 1바이트 | 0 ~ 255 | 부호 없음, 항상 양수 |
📌 ⚠️ 주의:
- char는 컴파일러에 따라 signed 또는 unsigned가 다를 수 있음.
- 명확한 표현을 원하면 signed char 또는 unsigned char를 사용!
🔷 3. char 사용 예제
#include <iostream>
using namespace std;
int main() {
char ch1 = 'A'; // 문자 저장
char ch2 = 65; // ASCII 값 저장 (65 → 'A')
unsigned char ch3 = 200; // 부호 없는 char (0~255 가능)
cout << ch1 << endl; // 출력: A
cout << ch2 << endl; // 출력: A
cout << (int)ch3 << endl; // 출력: 200 (정수로 변환)
return 0;
}
✔ ASCII 값으로 저장되므로, 정수처럼 사용 가능!
✔ unsigned char를 사용하면 0~255 범위의 값 저장 가능
📌 자동 형변환과 char 연산
✔ char는 연산 시 int로 변환됨
✔ char + int 연산을 하면, char가 int로 변환된 후 계산됨
#include <iostream>
using namespace std;
int main() {
char ch = 'A'; // ASCII 값 65
int num = 5;
cout << ch + num << endl; // 65 + 5 = 70 출력
cout << (char)(ch + num) << endl; // 'F' 출력 (ASCII 70)
return 0;
}
📌 char를 정수처럼 연산할 때 자동 형변환 발생!
✔ 'A' + 5 → 65 + 5 = 70 (int)
✔ (char)70 → 'F'
⚠️ 주의할 점
✔ char는 int보다 작기 때문에 연산 시 자동으로 int로 변환됨
✔ unsigned char를 사용하면 음수 값이 저장되지 않음
✔ 시스템마다 char의 기본 부호(signed/unsigned)가 다를 수 있음 → 명확하게 쓰는 것이 좋음 (signed char / unsigned char)
💡 한 줄 요약
✔ char는 사실 정수형 (ASCII 값 저장)
✔ char 연산 시 int로 변환됨
✔ unsigned char 사용 시 0~255 값 저장 가능
✔ 명확한 코드를 위해 signed char / unsigned char를 명시적으로 사용! 🚀
🔷 정수 자료형과 char의 특징 정리
🔹 char는 정수형으로 저장됨
- char는 문자형이지만 내부적으로 signed char 또는 unsigned char로 저장됨.
- 문자형으로 사용 가능: 'A' 같은 단일 문자 저장
- 정수형처럼 사용 가능:
char c = 'A'; int x = c; // x = 65 (ASCII 코드)
- signed char (-128 ~ 127), unsigned char (0 ~ 255) 값 저장 가능
🔹 char의 연산 가능
char c = 'A' + 1;
std::cout << c; // 출력: B
✔ char에 정수를 할당하면 해당 ASCII 코드에 대응하는 문자가 저장됨.
✔ char c = 65; // 'A' 저장
✔ 범위 초과 시 오버플로우 발생
char c = 300; // (300 % 256) → 44 저장됨
🔹 음수 표현 (2의 보수법)
- 2의 보수 변환 방법
- 비트 반전 (1 → 0, 0 → 1)
- 1을 더함
- MSB (Most Significant Bit, 최상위 비트)
- signed char에서는 부호 역할을 함.
- 0: 양수 (예: 00000001 → 1)
- 1: 음수 (예: 11111111 → -1)
🔹 signed char와 unsigned char 비교 정리
입력값 | unsigned char 저장값 | signed char 저장값 |
65 | 'A' (65) | 'A' (65) |
300 | 44 (',') | 44 (',') |
128 | 128 | -128 (오버플로우) |
255 | 255 | -1 (2의 보수 변환) |
🔹 signed char에 255를 저장하면 -1이 되는 이유
- signed char의 범위: -128 ~ 127
- 255를 8비트 이진수로 변환하면: 11111111
- 2의 보수 변환 과정
- 비트 반전: 11111111 → 00000000
- 1을 더함: 00000001
- 결과적으로 11111111은 -1을 의미함.
💡 결론:
🔷signed char에서 255를 저장하면 2의 보수 변환으로 인해 -1이 됨.
🔹 unsigned char에 -1을 저장하면?
- unsigned char는 음수를 표현할 수 없음.
- C++에서는 음수를 unsigned char에 저장할 때 내부적으로 256을 더함. 출력 결과: 255
unsigned char uc = -1; // -1을 unsigned char에 저장 std::cout << (int)uc << std::endl;
- unsigned char에 -1을 저장하면 255로 변환됨. (입력값을 256으로 나눈 나머지 값이 저장됨.)
🔷 cf. 게임 데이터에서 활용
✔ 자료형 범위를 넘을 때
- 값을 스케일 다운 (HP = 10 → HP = 1로 저장 후 연산 시 *10)
- 더 큰 자료형(short, int, long)을 사용.
🔷 실수 자료형 (Floating-Point) 정리
📌 C++ 실수형 자료형
자료형 | 크기 (byte) | 범위 |
float | 4 바이트 | ±1.5 × 10⁻⁴⁵ ~ ±3.4 × 10³⁸ |
double | 8 바이트 | ±5.0 × 10⁻³²⁴ ~ ±1.8 × 10³⁰⁸ |
long double | 8, 12, 16 바이트 (플랫폼에 따라 다름) | ±3.4 × 10⁻⁴⁹³² ~ ±1.1 × 10⁴⁹³² |
✔ float → 단정밀도 (소수점 약 7자리 정밀도)
✔ double → 배정밀도 (소수점 약 15자리 정밀도)
✔ long double → 확장 정밀도 (플랫폼마다 크기와 정밀도가 다름)
🚀 실수 연산 시 부동소수점 오차 발생 가능! (특히 float)
📌 실수는 정확한 값이 아니라 근사값으로 표현
✔ 부동소수점 연산은 정확한 값이 아닌 근사값
✔ 일부 실수는 이진수로 정확히 표현할 수 없어서 부동소수점 오차 발생 가능
✔ 부동소수점 오차를 줄이려면 일관된 자료형 사용 (double이면 double끼리 연산)
🔗 부동소수점 개념 자세히 보기 👉 🔗 부동소수의 이해
🛠 자동 형변환과 연산 과정 분석
🔹 1. int a = 4 + 4.0;
✔ 4는 정수형(int), 4.0은 실수형(double)
✔ 연산 시 암시적 형변환(Implicit Type Conversion) 발생
✔ 4가 double(4.0)로 변환 → 4.0 + 4.0 연산 수행
✔ 연산 결과 8.0(double)을 int에 저장 (소수점 버려짐)
✔ 결과: a = 8 (정수형)
🔹 2. int a = 4 + 4.1;
✔ 4 → 4.0 (double) 변환 후 연산
✔ 4.0 + 4.1 = 8.1 (double)
✔ 8.1을 int에 저장 (소수점 버려짐. int는 반올림이 아니라 버림.)
✔ 결과: a = 8 (정수형, 소수점 손실 발생)
🔹 3. float a = 4 + 4.0;
✔ 4 → 4.0 (double) 변환 후 연산
✔ 4.0 + 4.0 = 8.0 (double)
✔ 8.0 (double) → float 변환
✔ 결과: a = 8.0 (부동소수점, 문제없음)
🔹 4. float a = 4 + 4.1;
✔ 4 → 4.0 (double) 변환 후 연산
✔ 4.0 + 4.1 = 8.1 (double)
✔ 8.1 (double) → float 변환
✔ float의 정밀도가 double보다 낮아 미세한 손실 발생 가능
✔ 결과: a = 8.1 (부동소수점, 큰 문제 없음)
📌 자동 형변환 정리
코드 | 연산 과정 | 결과 |
int a = 4 + 4.0; | 4 → 4.0, 4.0 + 4.0 = 8.0, int(8.0) | a = 8 |
int a = 4 + 4.1; | 4 → 4.0, 4.0 + 4.1 = 8.1, int(8.1) | a = 8 (소수점 버려짐) |
float a = 4 + 4.0; | 4 → 4.0, 4.0 + 4.0 = 8.0 | a = 8.0 |
float a = 4 + 4.1; | 4 → 4.0, 4.0 + 4.1 = 8.1 | a = 8.1 |
⚠️ 주의할 점
✔ int에 double 값을 저장하면 소수점이 무조건 버려짐 (반올림 X)
✔ float은 double보다 정밀도가 낮아 정밀도 손실 가능
✔ C++에서 기본 실수형은 double이므로, float을 명시적으로 사용하려면 4.0f, 4.1f처럼 f 접미사 사용
✅ 성능과 정밀도를 고려하면 float a = 4 + 4.0f; 사용이 가장 바람직!
💡 한 줄 요약
✔ int에 실수 저장 시 소수점 손실
✔ float은 double보다 정밀도가 낮음
✔ 연산 시 같은 자료형을 유지하면 속도 향상 & 오류 방지! 🚀
'C++ > 유튜브 어소트락 게임아카데미 C++무료강의' 카테고리의 다른 글
6. 구조체(Structure) (0) | 2025.03.30 |
---|---|
5. 배열 (0) | 2025.03.26 |
4 함수 (0) | 2025.03.26 |
3. 연산자 및 전처리 구문 (0) | 2025.03.24 |
C언어/C++ 무료강의 - 1_인트로 (0) | 2025.03.14 |