나는 아마도이 문제에 대한 "권한있는"출처를 찾을 수 없다. 왜냐하면 이것은 아마도 협약의 문제 일 수 있고, 용어는 종종 매우 일치하지 않기 때문이다. 그러나 Robert Seacord의 " C 및 C ++의 보안 코딩 "에서 발췌 한 다음 내용 은 상황에 대한 이해를 요약 한 것입니다.
정수의 최대 값 이상으로 증가 또는 최소값 이상으로 감소 될 때 정수 오버 플로우가 발생 3 . 정수 오버플로는 기본 표현과 밀접한 관련이 있습니다.
각주는 다음과 같이 말합니다.
[3] 기술적으로이 용어는 부동 소수점 조건을 나타내지 만 최소값을 초과하는 정수를 줄이는 것은 종종 정수 언더 플로우 라고합니다 .
정수 오버플로 라고 부르는 이유는 유형에 사용 가능한 공간 이 부족 하여 값을 나타낼 수 없기 때문 입니다. 그런 의미에서 버퍼 오버플로와 비슷합니다 (실제로 버퍼 경계를 넘어가는 것을 제외하고는 일반적으로 랩 어라운드 동작을 나타냅니다. *)이 관점에서 INT_MIN - 1
와 사이에는 개념적 차이가 없습니다 INT_MAX + 1
. 두 경우 모두 int
데이터 유형에 공간이 충분하지 않아 값을 표현할 수 없습니다. 따라서 우리가 가진 것은 오버플로 입니다.
x86 및 x86_64 프로세서 아키텍처에서 플래그 레지스터에는 오버플로 비트가 포함되어 있습니다. 부호있는 정수 산술 연산이 오버플로 될 때 오버플로 비트가 설정됩니다. 식은 INT_MIN - 1
오버플로 비트를 설정합니다. ( "언더 플로우"비트는 없습니다.) 따라서 AMD와 인텔 엔지니어들은 "오버 플로우"라는 용어를 사용하여 데이터 유형에 맞지 않는 비트가 너무 많은 정수 산술 연산의 결과를 설명합니다. 수치가 너무 크거나 작습니다.
* 실제로 C에서 부호있는 정수 오버플로는 실제로 정의되지 않은 동작이지만 Java와 같은 다른 언어에서는 2의 보수 산술이 래핑됩니다.
INT_MIN - 1
또는INT_MAX + 1