STUDY/C++

[C++] 기본 자료형

램플릿 2025. 4. 29. 02:40

 

 

자료형의 유효범위

 

자료형 크기 저장할 수 있는 값의 범위
char 1바이트 -128 ~ 127
short 2바이트 -32768 ~ 32767 (= -2^15 ~ 2^15 -1)
unsigned short 2바이트 0 ~ 65535 (= 0 ~ 2^16 -1)
int 4바이트 -2147483648 ~ 2147483647 (= -2^31 ~ 2^31 -1)
unsigned int 4바이트 0 ~ 4294967295 (= 0 ~ 2^32 -1)
long 4바이트(8바이트) -2147483648 ~ 2147483647 (= -2^31 ~ 2^31 -1)
unsigned long 4바이트(8바이트) 0 ~ 4294967295 (= 0 ~ 2^32 -1)
float 4바이트
  • 최소값 (절댓값 기준, 양수): 약 1.17549 × 10⁻³⁸
  • 최댓값: 약 3.40282 × 10³⁸
double 8바이트
  • 최소값 (절댓값 기준, 양수): 약 2.22507 × 10⁻³⁰⁸
  • 최댓값: 약 1.79769 × 10³⁰⁸

 

  • unsigned char은 그래픽스에서 RGB값을 표현하고자 할때 사용한다. 범위는 0~255이다.
  • long은 플랫폼에 따라 Windows에서는 4바이트, 64비트 리눅스/맥OS에서는 8바이트이다. 따라서 최소 8바이트(64비트)를 보장하는 정수형 자료형을 사용하려면 long long을 사용해야 한다.
    • long long의 범위: (–9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)(= –2⁶³ ~ 2⁶³ – 1)
    • unsigned long long의 범위 : 0 ~ 18,446,744,073,709,551,615 (= 0 ~ 2⁶⁴ – 1 )
  • float의 최대 정밀도는 약 7자리 십진수입니다.
    즉, float은 소수점 포함 최대 약 7자리 정도까지 숫자를 정확하게 표현할 수 있어요.
    이걸 넘어서면 소수점 이하 또는 전체 숫자가 반올림되거나 오차가 생깁니다.

🔹 float으로 정확하게 표현 가능한 예시들 (7자리 이내):

1.234567 정확하게 저장됨 (7자리) ✅
1234567.0 정확하게 저장됨 (정수 7자리) ✅
0.1234567 정확하게 저장됨 (소수 7자리) ✅
123.4567 정확하게 저장됨 ✅
1.000001 작은 차이도 반영 가능 (7자리) ✅

🔸 정밀도가 초과되는 예시들 (정확히 표현 안 됨):

1.2345678 1.234568 (반올림됨) ❌
12345678.0 12345680.0 (정수 잘림) ❌
0.123456789 0.12345679 (오차 있음) ❌
999.999999 1000.0 (반올림됨) ❌

 

 

 

 

아스키코드

숫자 아스키코드 값

'0' '1' '2' '3' '4' '5' '6' '7' '8' '9'
48 49 50 51 52 53 54 55 56 57

 

 

대문자 아스키코드 값

'A' 'B' 'C' 'D' 'E' 'F' ... 'X' 'Y' 'Z'
65 66 67 68 69 70   88 89 90

 

 

소문자 아스키코드 값

'a' 'b' 'c' 'd' 'e' 'f' ... 'x' 'y' 'z'
97 98 99 100 101 102   120 121 122

 

 

\0 (널 문자) 의 아스키코드 값은 0이다.

공백 문자 (스페이스 키) 의 아스키코드 값은 32이다.

 

 

 

문자열형

"John"을 저장하려면 char name[5] = "John"; 과 같이 작성해야한다.

  • 배열에 5개의 기억공간을 할당한 이유는 "John"이 문자열로 저장되기 위해서 실제로는 'J', 'o', 'h', 'n', '\0' 처럼 문자열 끝에 널 문자가 항상 존재하기 때문이다.
  • 따라서 이렇게도 작성 가능하다. char name[5] = { 'J', 'o', 'h', 'n', '\0' };
    • 'a'와 "a"는 다르다. 'a'는 문자 a지만, "a"는 'a', '\0'으로 구성된 문자열이다.
    • 널 문자 '\0'는 문자열의 종료를 의미하므로, cout << "Jo\0hn" << "\n"; 처럼 중간에 널 문자를 넣으면 널 문자 앞에서 문자열이 종료된 것으로 인식해, 삽입된 널 문자 바로 이전까지의 문자열("Jo")만 출력된다.
  • 변수를 선언함과 동시에 값을 주는 것을 초기화라고 하는데, 문자열을 초기화 할때는 배열의 크기를 지정하지 않고 []처럼 사용해도 알아서 배열의 크기를 책정해 적당한 크기의 공간이 할당된다.
    • char name[] = "John";
  • strlen(name)은 문자열의 길이를 나타내므로 널 문자를 포함하지 않은 4를 출력하지만, sizeof(name)은 배열의 크기를 나타내므로 널 문자를 포함한 5로 출력된다.(바이트 크기)

 

 

 

 

논리형(bool형)

C와 달리 C++에는 참과 거짓을 나타내는 bool 형을 이용해 true(1) 와 false(0)를 나타낼 수 있다.

bool형은 0이 아닌 값은 true로, 0은 false로 묵시적으로 자료형이 변환될 수 있다.

#include<iostream>
using namespace std;
void main(){
    bool b1 = true, b2 = false;
    bool b3 = -1, b4 = 0;
    cout << " b1(true) = " << b1 << "\n";	//b1(true) = 1 출력
    cout << " b2(false) = " << b2 << "\n";	//b2(false) = 0 출력
    cout << " b3(-1) = " << b3 << "\n";		//b3(-1) = 1 출력
    cout << " b4(0) = " << b4 << "\n";		//b4(0) = 0 출력
}

 

💡논리 연산자
&& - 논리곱(logical AND) 연산자
|| - 논리합(logical OR) 연산자
! - 단항 논리부정(logical NOT) 연산자

 

💡비트 단위 연산자
& - 비트 논리곱(AND) 두 비트 모두 1일때 결과비트가 1이다.
| - 비트 논리합(OR) 두 비트 중 적어도 한 비트가 1일때 결과비트가 1이다.
^ - 비트 배타적논리합(XOR) 두 비트가 서로 다른 비트일때 결과 비트가 1이 된다.
<< - Left Shift 지정개수만큼 피연산자의 비트들을 왼쪽으로 이동(시프트)한다. 오른쪽은 0으로 채운다.
>> - Right Shift 지정개수만큼 피연산자의 비트들을 오른쪽으로 이동한다. 왼쪽에 값 채우는 방법은 시스템에 따라 다르다.
~ - 1의 보수(one's complement) 모든 0비트는 1이 되고, 모든 1비트는 0이 된다. (NOT)