C에서 부호 있는 정수 오버플로의 정의되지 않은 동작
부호 있는 정수의 값이 표현 가능한 범위를 초과할 때 발생하는 부호 있는 정수 오버플로가 잘 발생합니다. -C에서 정의되지 않은 동작으로 알려져 있습니다. 그러나 C 11 cstdint 문서에는 흥미로운 진술이 소개되어 있습니다. int8_t, int16_t, int32_t 및 int64_t 유형의 음수 값은 2의 보수를 사용하여 표현되는 것으로 명시적으로 지정됩니다.
이 사양은 다음과 같은 질문을 제기합니다. 이러한 유형의 음수 값에 대한 2의 보수는 정의되지 않은 동작 상태를 변경합니다. 넘치나요?
불행히도 대답은 그렇습니다입니다. C 11 표준의 섹션 18.4.1에 따르면 헤더는 C 표준의 섹션 7.20과 동일하게 모든 함수, 유형 및 매크로를 정의합니다. C11 표준의 섹션 7.20.1.1에서는 intN_t를 2의 보수 표현을 사용하는 부호 있는 정수 유형으로 정의합니다.
2의 보수 표현에 대한 이러한 사양에도 불구하고 C 11 표준은 섹션 5/4에서 다음과 같이 명확하게 명시합니다. 정의되지 않은 수학적 결과를 초래하거나 해당 유형의 표현 가능한 범위를 벗어나는 표현식은 정의되지 않은 결과를 낳습니다. 동작.
따라서 음수 값에 2의 보수를 사용한다고 해서 이러한 유형의 산술이 모듈로 2^n 동작을 준수한다는 의미는 아닙니다. 그러나 부호 없는 정수의 경우 표준에서는 2^n 산술 법칙을 적용하여 오버플로 동작을 수학적으로 정의하고 표현 가능한 범위 내에서 렌더링하도록 명시적으로 지정합니다. 따라서 서명되지 않은 오버플로는 정의되지 않은 동작으로 간주되지 않습니다.
위 내용은 2의 보수 표현은 C 부호 있는 정수 오버플로에서 정의되지 않은 동작을 제거합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!