본문 바로가기
C++/유튜브 어소트락 게임아카데미 C++무료강의

2. 자료형

by GREEN나무 2025. 3. 17.
728x90

자료형으로 변수의 저장 자리를 확보하고 할당.

 

🔷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. 비트 반전 (1 → 0, 0 → 1)
    2. 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의 보수 변환 과정
    1. 비트 반전: 11111111 → 00000000
    2. 1을 더함: 00000001
    3. 결과적으로 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