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바이트 |
|
double | 8바이트 |
|
- 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)