INT_MIN-1이 언더 플로 또는 오버플로입니까?


10

나는 그것을 읽고 있었다 기억

  • underflow더 이상 유형으로 표시 할 수없는 너무 작은 크기 를 의미합니다.
  • overflow더 이상 유형으로 표시 할 수없는 너무 큰 크기 를 의미합니다.

그러나 실제로는 용어가 다음과 같이 사용된다는 것을 인식합니다.

  • underflow더 이상 유형으로 표시 할 수없는 너무 작은 을 의미합니다.
  • overflow더 이상 유형으로 표시 할 수없는 너무 큰 을 의미합니다.

여기서 사용하는 올바른 의미는 무엇입니까? 정수 및 부동 소수점 유형에 대해 용어가 다르게 정의되어 있습니까?


2
일반적으로 "언더 플로우"라는 용어는 부동 소수점 산술을 위해 예약 된 것 같습니다. 정수로, 나는 보통 관계없이 여부의 "오버 플로우"말 INT_MIN - 1또는INT_MAX + 1
찰스 샐비어

답변:


15

나는 아마도이 문제에 대한 "권한있는"출처를 찾을 수 없다. 왜냐하면 이것은 아마도 협약의 문제 일 수 있고, 용어는 종종 매우 일치하지 않기 때문이다. 그러나 Robert Seacord의 " C 및 C ++의 보안 코딩 "에서 발췌 한 다음 내용 은 상황에 대한 이해를 요약 한 것입니다.

정수의 최대 값 이상으로 증가 또는 최소값 이상으로 감소 될 때 정수 오버 플로우가 발생 3 . 정수 오버플로는 기본 표현과 밀접한 관련이 있습니다.

각주는 다음과 같이 말합니다.

[3] 기술적으로이 용어는 부동 소수점 조건을 나타내지 만 최소값을 초과하는 정수를 줄이는 것은 종종 정수 언더 플로우 라고합니다 .

정수 오버플로 라고 부르는 이유는 유형에 사용 가능한 공간 이 부족 하여 값을 나타낼 수 없기 때문 입니다. 그런 의미에서 버퍼 오버플로와 비슷합니다 (실제로 버퍼 경계를 넘어가는 것을 제외하고는 일반적으로 랩 어라운드 동작을 나타냅니다. *)이 관점에서 INT_MIN - 1와 사이에는 개념적 차이가 없습니다 INT_MAX + 1. 두 경우 모두 int데이터 유형에 공간이 충분하지 않아 값을 표현할 수 없습니다. 따라서 우리가 가진 것은 오버플로 입니다.

x86 및 x86_64 프로세서 아키텍처에서 플래그 레지스터에는 오버플로 비트가 포함되어 있습니다. 부호있는 정수 산술 연산이 오버플로 될 때 오버플로 비트가 설정됩니다. 식은 INT_MIN - 1오버플로 비트를 설정합니다. ( "언더 플로우"비트는 없습니다.) 따라서 AMD와 인텔 엔지니어들은 "오버 플로우"라는 용어를 사용하여 데이터 유형에 맞지 않는 비트가 너무 많은 정수 산술 연산의 결과를 설명합니다. 수치가 너무 크거나 작습니다.


* 실제로 C에서 부호있는 정수 오버플로는 실제로 정의되지 않은 동작이지만 Java와 같은 다른 언어에서는 2의 보수 산술이 래핑됩니다.


6

오버플로입니다. 정수 값에는 언더 플로가 발생하지 않습니다.

오버플로는 값이 너무 커서 (0에서 너무 멀어서) 특정 유형으로 표현되지 않을 때 언더 플로는 너무 작아 (0에서 너무 멀 때)입니다.

0에 가장 가까운 정수 값 (1 및 -1)은 여전히 ​​정수 변수로 표시 될 수 있으므로 (1 비트 이상의 부호있는 정수로 가정) 언더 플로가 발생할 수 없습니다.

언더 플로에 대한 Wikipedia 기사 에는 다음과 같은 명확한 설명이 있습니다.

"산술 언더 플로우 (또는"부동 소수점 언더 플로우 "또는"언더 플로우 ")라는 용어는 부동 소수점 연산의 실제 결과가 크기가 작을 때 (즉, 0에 가까울 때) 발생할 수있는 컴퓨터 프로그램의 조건입니다. 대상 데이터 유형에서 일반 부동 소수점 숫자로 표시 할 수있는 가장 작은 값보다 큽니다. 언더 플로는 부분적으로 부동 소수점 값 지수의 음의 오버플로로 간주 될 수 있습니다. "


그것은 참고로 유용 할 수있다 underflow종종 다수의 크기가 가장 작은 영이 아닌 값보다 작은 경우 상기 특정 조건을 참조하도록 특별히 사용되지만, 비 - 제로 값의 가능한 최소 거리보다 큰 - 기타의 즉, 위키 기사에서 "언더 플로우 갭"이라고하는 숫자에 해당하는 숫자입니다. IEEE-744 호환 구현에서 가장 작은 표현 가능한 숫자는 숫자 간의 가장 작은 표현 가능한 차이와 같으므로 이러한 언더 플로는 발생할 수 없지만 PC 세계 외부에서는 모든 시스템이 IEEE를 준수하는 것은 아닙니다.
supercat

2

정수 수학에서 overflow는 너무 큰 값과 너무 작은 값을 모두 나타냅니다. 부동 소수점에서 오버플로는 너무 큰 지수를 나타내고 언더 플로는 너무 작은 지수를 나타냅니다.

실제로 정수 유형의 경우 CPU는 오버플로와 언더 플로의 차이를 구분할 방법이 없습니다. 다음 16 비트 추가를 수행하십시오.

  0x8000 (unsigned 32768, or signed -32767)
+ 0xFFFF (unsigned 65535, or signed -1)
--------
  0x7FFF (32767, the carried '1' is lost)

물론 CPU의 오버플로 플래그는이 추가 후에 설정됩니다. 부호있는 수학을 사용하면 결과가 너무 작습니다 (-32768). 부호없는 수학을 사용하면 결과가 너무 큽니다 (0x17FFF). 2의 보수 수학은 부호있는 유형과 부호없는 유형에 대해 동일 overflow하므로 너무 큰 값과 너무 작은 값을 모두 의미합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.