출처 : C++ 실력 완성 올인원 패키지 Online[fastcampus]
#include <iostream>
#include <numeric> // 최대값, 최소값을 보기 위해 포함
int main()
{
// 선언과 동시에 초기화
// C 스타일 초기화
int y = 1;
cout << y;
// C++ 스타일 초기화
int z(2);
cout << z << endl;
}
// 정수형 리터럴
int num0 = 11; // 일반 정수 리터럴
int num1 = 011; // 8진수 정수 리터럴
int num2 = 0b11; // 2진수 정수 리터럴
int num3 = 0x11; // 16진수 정수 리터럴
cout << "num0 " << num0 << endl; // 11
cout << "num1 " << num1 << endl; // 8 + 1 = 9
cout << "num2 " << num2 << endl; // 2 + 1 = 3
cout << "num3 " << num3 << endl; // 16 + 1 = 17
// Windows x86(32bit)의 경우 4/4/4
// Windows x64(64bit)의 경우 4/4/8
// Unix and Unix-like 환경은 다른 결과 출력
int intNum = 0;
long longNum = 0;
int* intPointer = &intNum;
cout << sizeof(intNum) << endl;
cout << sizeof(longNum) << endl;
cout << sizeof(intPointer) << endl;
어느 환경에서도 고정된 길이를 보장하는 법
int8_t num00 = 0;
int16_t num11 = 0;
int32_t num22 = 0;
cout << sizeof(num00) << endl; // 1
cout << sizeof(num11) << endl; // 2
cout << sizeof(num22) << endl; // 4
{
// 리터럴 접미사를 이용하여 정수형의 세부 타입을 표현
int intNum_ = 11;
unsigned int uintNum = 11u;
long int longNum_ = 0L;
long long longLongNum = 0LL;
unsigned long long ulongLongNum = 0uLL;
}
uint8_t num0 = 1;
std::cout << (int)num0;
cout << (int)numeric_limits<uint8_t>::max() << '\n'; // 형변환 필요
cout << numeric_limits<uint16_t>::max() << '\n';
cout << numeric_limits<uint32_t>::max() << '\n';
cout << numeric_limits<uint64_t>::max() << '\n';
/* 65535
4294967295
18446744073709551615
*/
부호 표시는 MSB로
음수의 표현 방법?
2의 보수를 취하는데 각 비트를 반전 후 1을 더한다.
아래와 같이 부호가 있는 숫자의 값을 알기 위해서는 역시 각 비트를 반전 후 1을 더해서 음수값을 알 수 있음.
signed 정수의 최대값
cout << (int)numeric_limits<int8_t>::max() << '\n'; // 형변환 필요 cout << numeric_limits<int16_t>::max() << '\n'; cout << numeric_limits<int32_t>::max() << '\n'; cout << numeric_limits<int64_t>::max() << '\n'; /* 32767 2147483647 9223372036854775807 */
cout << (int)numeric_limits<int8_t>::min() << '\n'; // 형변환 필요
cout << numeric_limits<int16_t>::min() << '\n';
cout << numeric_limits<int32_t>::min() << '\n';
cout << numeric_limits<int64_t>::min() << '\n';
/*
-32768
-2147483648
-9223372036854775808
*/
음수의 덧셈도 양수의 덧셈과 같은 방식으로 carry를 하나씩 올리면서 계산을 하면 된다.
뺄셈의 경우 2의 보수를 더해주는 방식으로 구현한다.
표현할 수 있는 최대값보다 더 커지는 상태
uint32_t num32 = numeric_limits<uint32_t>::max();
uint32_t num32_ = num32 + 1;
cout << num32 << endl;
cout << num32_ << endl;
/*
4294967295
0
*/
Unsigned의 경우 1을 더하면 보이는 메모리에서 알 수 있듯 0으로 돌아감.
Signed의 경우 최대값에서 1을 더하면 최소값이 됨.
표현할 수 있는 최저값보다 더 적어지는 상태
uint32_t num32 = numeric_limits<uint32_t>::min();
uint32_t num32_ = num32 - 1;
cout << num32 << endl;
cout << num32_ << endl;
/*
0
4294967295*/