
보통 정수형은 int를 사용하나, 크기가 큰 정수를 저장할때는 long long을 사용한다.
// ❌ 위험한 코드
int a = 100000;
int b = 100000;
int result = a * b; // 10,000,000,000 → int 범위 초과! → 오버플로우!
// ✅ 안전한 코드
long long a = 100000;
long long b = 100000;
long long result = a * b; // OK!
// ✅ 또는 캐스팅
int a = 100000, b = 100000;
long long result = (long long)a * b; // 곱하기 전에 형변환!
위의 예시들에 대해서 하나 하나 살펴볼 것이다.
// ❌ 위험한 코드
int a = 100000;
int b = 100000;
int result = a * b; // 10,000,000,000 → int 범위 초과! → 오버플로우!
위의 경우 a * b 수행시 int (4 Byte)에 10000000000(0b 0010 0101 0100 0000 1011 1110 0100 0000 0000) 에서 상위 4
비트가 날라가고 int result에 하위 32비트만 저장되는 오류가 발생한다.
// ✅ 안전한 코드
long long a = 100000;
long long b = 100000;
long long result = a * b; // OK!
위의 경우, long long 이면 int보다 표현 범위가 크므로(비트 자리수가 많으므로), 비트가 잘리는 현상 없이 정상적으로 수를 저장할 수 있다.
// ✅ 또는 캐스팅
int a = 100000, b = 100000;
long long result = (long long)a * b; // 곱하기 전에 형변환!
위의 경우도 a 와 b는 int지만 ab가 수행되기전에 a를 long long으로 형 변환하여 `ab가 long long`으로 형변환된다.
따라서 result에 정상적인 값이 저장된다.

보통 double을 사용하고, 메모리 절약이 필요한 경우 float을 사용한다.

보통 char를 사용한다.
char ch = 'A'; // 실제로 65가 저장됨
char ch2 = 65; // 이것도 'A'
// 자주 쓰는 ASCII 값
// 'A' = 65, 'Z' = 90
// 'a' = 97, 'z' = 122
// '0' = 48, '9' = 57
// 대문자 → 소문자 변환
char lower = 'A' + 32; // 'a'
// 문자 → 숫자 변환
int num = '7' - '0'; // 7
char에 '를 사용해서 문자를 저장하더라도, 이는 내부적으로 상응하는 ASCII 코드로 바뀌어 정수 형태로 char 에 저장된다.
이를 이용하면 위와같이 대문자 <-> 소문자, 문자 <-> 숫자 변환이 가능하다.

C++ 에서는 2가지 방식(C 스타일, C++ 스타일)으로 문자열을 사용할 수 있다.
\0 이 붙는다.#include <string>
// C 스타일 (배열)
char s1[10] = "hello"; // 실제: ['h','e','l','l','o','\0',...]
// 크기 변경 불가!
// C++ 스타일 (string 객체)
string s2 = "hello";
s2 += " world"; // 이어붙이기 가능!
int len = s2.length(); // 길이: 11

문제에서
(1) 입력값이 매우 크거나
(2) 코드 실행 과정에서 숫자가 너무 커질 것 같거나
(3) "답이 매우 클 수 있으므로..."라는 문구가 보이면
→ 정수는 long long으로, 실수는 double로 사용한다.
int a = 10, b = 3;
a + b; // 13 덧셈
a - b; // 7 뺄셈
a * b; // 30 곱셈
a / b; // 3 나눗셈 (정수끼리는 소수점 버림!)
a % b; // 1 나머지 (모듈러, 코테에서 엄청 자주 씀)
// ⚠️ 정수 나눗셈 주의
7 / 2; // 3 (소수점 버림)
7.0 / 2; // 3.5 (하나라도 실수면 실수 나눗셈)
(double)7 / 2; // 3.5
연산에서 하나라도 실수 자료형이면 결과도 실수 자료형으로 형변환된다.
// 비교 (결과: true/false)
a == b // 같다
a != b // 다르다
a < b a > b a <= b a >= b
// 논리
a && b // AND: 둘 다 true여야 true
a || b // OR: 하나만 true여도 true
!a // NOT: a가 0이면 1, 0이 아니면 0
a & b // AND (둘 다 1이면 1)
a | b // OR (하나라도 1이면 1)
a ^ b // XOR (다르면 1)
~a // NOT (비트 반전)
a << n // 왼쪽 시프트 (× 2^n 와 동일)
a >> n // 오른쪽 시프트 (÷ 2^n 와 동일)
// 조건 ? 참일때값 : 거짓일때값
int mx = (a > b) ? a : b; // max(a, b)와 동일
a > b가 참이면, (a > b) ? a : b가 a를 반환하고,
a > b가 거짓이면, (a > b) ? a : b가 b를 반환한다.
a++; ++a; // a = a + 1
a--; --a; // a = a - 1
a += 5; // a = a + 5
a -= 3; // a = a - 3
a *= 2; // a = a * 2
a /= 4; // a = a / 4
a %= 3; // a = a % 3
여기서 중요한 점이, a++과 ++a는 동작 방식이 다르다.
리터럴이란,
값 자체를 의미한다.
int n = 42; // 42 ← 이게 리터럴
double d = 3.14; // 3.14 ← 이게 리터럴
char c = 'A'; // 'A' ← 이게 리터럴
string s = "hello";// "hello" ← 이게 리터럴
bool b = true; // true ← 이게 리터럴
정수 리터럴은 int 타입이고, 실수 리터럴은 double 타입이다.