수치 범위와 오버플로 동작
std::numeric_limits를 조회하고 부호 있는 정수와 부호 없는 정수의 오버플로 규칙을 이해합니다.
수치 범위와 오버플로 동작은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
범위가 중요한 이유
모든 숫자형에는 표현할 수 있는 최댓값과 최솟값이 있습니다. 이 범위를 넘으면 잘못된 결과가 조용히 발생하거나 정의되지 않은 동작이 일어날 수 있습니다.
std::numeric_limits
<limits> 헤더를 사용하면 모든 숫자형의 범위를 조회할 수 있습니다. 컴파일 시간 상수이므로 실행 시간 비용이 없습니다.
#include <limits>
std::cout << std::numeric_limits<int>::max() << "\n";
std::cout << std::numeric_limits<int>::min() << "\n";
std::cout << std::numeric_limits<double>::epsilon();자주 사용하는 조회
가장 유용한 멤버는 다음과 같습니다.
max()— 최댓값min()— 최솟값(양수 중 최솟값)lowest()— 가장 작은 값epsilon()— 의미 있는 최소 차이(부동 소수점형)digits10— 보장되는 십진수 자릿수
부호 있는 정수 오버플로
부호 있는 정수 오버플로는 정의되지 않은 동작입니다. 컴파일러는 오버플로가 절대 발생하지 않는다고 가정할 수 있으므로, 예상하지 못한 최적화가 일어날 수 있습니다.
int x = std::numeric_limits<int>::max();
x += 1; // UB — anything can happen부호 없는 정수의 순환
부호 없는 정수 오버플로는 정의되어 있습니다. 값이 2^N을 법으로 하여 순환합니다. 때로는 유용하지만, 예상하지 못한 버그를 일으키기 쉽습니다.
unsigned int u = 0;
u -= 1; // wraps to 4,294,967,295 (UINT_MAX)부동 소수점 오버플로와 언더플로
부동 소수점 수는 오류로 중단되는 대신 inf로 오버플로됩니다. 언더플로가 발생하면 비정규 수 또는 0이 됩니다.
double x = 1e308;
x *= 100;
std::cout << x; // inf안전하게 오버플로 감지하기
부호 있는 정수는 연산 전에 확인하십시오. 컴파일러는 GCC/Clang의 __builtin_add_overflow와 같은 내장 검사 산술 도우미를 제공합니다.
if (a > std::numeric_limits<int>::max() - b) {
// overflow would happen
}
int sum = a + b;C++20의 std::ssize와 std::cmp_less
C++20에서는 <utility>에 안전한 정수 비교 도우미를 추가했습니다. std::cmp_equal, cmp_less, cmp_greater 등이 있으며, 부호 있는 정수와 부호 없는 정수를 올바르게 섞어 비교합니다.
암시적 변환은 알아채기 어렵습니다
비교에서 부호 있는 정수와 부호 없는 정수를 섞으면 부호 있는 피연산자가 조용히 부호 없는 정수로 변환됩니다. 이는 미묘한 버그의 흔한 원인입니다.
int a = -1;
unsigned int b = 1;
if (a < b) std::cout << "yes";
else std::cout << "no"; // prints "no"!컴파일 시간 검사
이식성 있는 코드를 작성할 때 크기에 대한 가정을 강제하려면 static_assert를 사용하십시오.
static_assert(sizeof(int) >= 4, "Need at least 32-bit int");테스트에 도움이 되는 검사 도구
테스트 중 실행 시간에 부호 있는 정수 오버플로를 감지하려면 -fsanitize=undefined로 빌드하십시오.
g++ -fsanitize=undefined -O1 main.cpp빠른 확인
C++에서 부호 있는 정수 덧셈이 오버플로되면 어떻게 됩니까?
복습
std::numeric_limits를 사용하여 숫자형의 범위를 조회하십시오. 부호 있는 정수 오버플로는 정의되지 않으며, 부호 없는 정수는 순환합니다. 부호 있는 정수와 부호 없는 정수를 섞어 사용할 때는 주의하십시오. 검사 도구와 C++20의 안전한 비교 함수가 코드를 보호하는 데 도움이 됩니다.
자주 묻는 질문
“수치 범위와 오버플로 동작” 강의는 무료인가요?
네 — “수치 범위와 오버플로 동작” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“수치 범위와 오버플로 동작”에서 뭘 배우나요?
std::numeric_limits를 조회하고 부호 있는 정수와 부호 없는 정수의 오버플로 규칙을 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C++ Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“수치 범위와 오버플로 동작” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.