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

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

DDD
DDD원래의
2024-12-21 04:02:09821검색

Is Signed Integer Overflow Still Undefined Behavior in C  ?

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

C 11 표준에 정의된 대로 부호 있는 정수 오버플로는 정의되지 않은 동작으로 유지됩니다. int8_t, int16_t, int32_t 및 int64_t 유형이 음수 값에 2의 보수를 사용한다고 명시한 cstdint 문서에도 불구하고 오버플로 동작은 여전히 ​​정의되지 않은 것으로 간주됩니다.

문단 5/4의 C 11 표준에서는 다음과 같이 강조합니다.

**식을 평가하는 동안 결과가 수학적으로 정의되지 않았거나 해당 유형에 대해
표현 가능한 값의 범위, 동작은 정의되지 않습니다.**

따라서 이러한 부호 있는 유형에 대해 2의 보수 표현이 사용되더라도 산술 모듈로 2^n은 동안 암시적으로 가정되지 않습니다. 평가.

반대로, C 11 표준은 3.9.1/4 단락에서 서명되지 않은 것을 명시적으로 지정합니다. 산술은 모듈러 산술을 준수합니다.

부호 없이 선언된 부호 없는 정수는 2^n 모듈로 산술 법칙을 따릅니다 여기서 n은 값 표현의 비트 수
입니다. 특정 크기의 정수

결과적으로 부호 없는 산술 연산은 다음과 같습니다. 항상 수학적으로 정의 가능하며 결과 값은 표현 가능한 범위 내에 있으므로 정의되지 않은 동작 절에서 제외됩니다. 각주 46에서는 이를 더욱 명확히 설명합니다.

이는 부호 없는 산술이 오버플로되지 않음을 의미합니다. 왜냐하면 결과
부호 없는 정수 유형으로 표현할 수 없는 결과는 1인 숫자의 모듈로 감소되기 때문입니다.
결과 부호 없는 정수로 나타낼 수 있는 가장 큰 값보다 큽니다. type.

요약하자면, 부호 있는 유형에 대한 2의 보수 표현을 사용하면 음수 값에 대해 잘 정의된 동작을 제공하는 반면 표준이 모든 구현 종속 동작을 재정의하므로 이러한 유형에 대한 정수 오버플로는 C에서 정의되지 않은 동작으로 유지됩니다. .

위 내용은 C에서 부호 있는 정수 오버플로가 여전히 정의되지 않은 동작입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.