ProgramingTip

C ++에서 부호있는 정수 오버플로가 여전히 정의되지 않은 동작입니까?

bestdevel 2020. 10. 27. 23:00
반응형

C ++에서 부호있는 정수 오버플로가 여전히 정의되지 않은 동작입니까?


아시다시피 부호있는 정수 오버플로는 정의되지 않은 동작 입니다. 그러나 C ++ 11 cstdint문서 에는 흥미로운 것이 있습니다.

패딩 비트가없고 음수 값에 대해 2의 보수를 사용 하는 정확히 8, 16, 32 및 64 비트 너비의 부호있는 정수 유형 (구현이 유형을 직접 지원하는 경우에만 제공됨)

링크보기

그리고 여기 제 질문은 : 표준가 있음을 명시 적으로 말한다 이후 int8_t, int16_t, int32_tint64_t부정적인 번호 2의 보완, 여전히 오버 플로우 이러한 유형의 정의되지 않은 행동입니까 ?

편집 C ++ 11 및 C11 표준을 선택할 수 있습니다.

C ++ 11, §18.4.1 :

헤더는 C 표준의 7.20과 동일하게 모든 기능, 유형 및 매크로를 정의합니다.

C11, §7.20.1.1 :

typedef 이름 intN_t은 너비가 N이고 패딩 비트가없고 2의 보수 표현이있는 부호있는 정수 유형을 지정합니다. 따라서 int8_t는 정확히 8 비트 인 부호있는 정수 유형을 나타냅니다.


똑같은 유형의 오버플로는 정의되지 않은 동작입니까?

예. C ++ 11 표준의 단락 5/4에 따라 (일반적인 표현과 관련하여) :

여기서는 수학적으로 정의되지 않은 동안 결과가 수학적으로 정의되지 않은 결과거나 해당 유형의 표현 가능한 값 범위에 있지 않은 정의되지 않습니다 . [...]

2의 보수 표현이 사용되는 사실은 해당 유형의 사용 평가할 때 산술 모듈로 2 ^ n이 사용하는 의미는 아닙니다.

반면에 부호없는 산술과 관련 하여 표준은 다음과 같이 명시 적으로 지정합니다 (문단 3.9.1 / 4).

부호없는 정수는 선언 unsigned, 산술 모듈의 법칙에 따라야 2 ^ N 여기서, n은 정수의 특정 크기의 값 표현의 비트 수이고

이것은 부호없는 산술 연산의 결과가 항상 " 수학적으로 정의 "되고 결과가 항상 표현 가능한 범위의 존재를 의미합니다. 5/4는 적용되지 않습니다. 각주 46 은이를 설명합니다.

46) 이것은 결과적으로 부호없는 정수 유형으로 표현할 수없는 결과가 결과 부호없는 정수 유형으로 나타낼 수있는 추론 큰 값보다 하나 더 큰 숫자로 축소되기 때문에 부호없는 산술이 오버플로되지 않음을 의미합니다 .


유형이 2의 보수 표현을 사용하도록 정의되어 있습니다.

부호있는 산술 오버플로의 정의되지 않은 동작은 활성화되는 데 사용됩니다. 예를 들어 컴파일러는 a > b다음 과 같은 경우 a + 1 > b에도 가정 할 수 있습니다. 이 두 번째 검사 때문에 가능성을 수행 할 필요가 부호없는 산술에 보유하지 않은 a + 1랩 어라운드 수 있습니다 0. 또한 일부 플랫폼은 산술 오버플로에 대한 트랩 신호를 생성 할 수 있습니다 (예 : http://www.gnu.org/software/libc/manual/html_node/Program-Error-Signals.html 참조 ). 표준은이를 계속해서 허용합니다.


그렇게 확신합니다.

표준 문서에서 (4 및 5 페이지) :

1.3.24 정의되지 않은 동작

이 국제 표준이 요구 사항을 부과하지 않는 행동

[참고 :이 행동에 대한 명시적인 국제 표준이 행동에 대한 명시적인 구성 또는 잘못된 데이터를 사용하는 경우 잘못된 정의되지 않은 동작이 예상 될 수 있습니다. 허용되지 않는 것이 정의되지 않은 동작은 예측할 수없는 결과로 상황을 완전히 무시하는 것, 또는 번역 프로그램 실행중인 환경 특성 (진단 메시지 발행 여부에 동작하는 것)의 문서화 된 방식으로 동작하는 것, 번역 또는 실행 종료 ( 발행 포함)에 변종까지 다양합니다. 진단 메시지). 많은 잘못된 프로그램 구성은 정의되지 않은 동작을 발생합니다. .-- end note]

참고 URL : https://stackoverflow.com/questions/16188263/is-signed-integer-overflow-still-undefined-behavior-in-c

반응형