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

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

Linda Hamilton
풀어 주다: 2024-12-25 01:18:25
원래의
684명이 탐색했습니다.

Is Signed Integer Overflow in C   Still Undefined Behavior?

C의 부호 있는 정수 오버플로: 여전히 정의되지 않은 동작

C 11 cstdint 문서에 강조 표시된 대로 int8_t, int16_t와 같은 부호 있는 정수 유형 , int32_t 및 int64_t는 2의 보수를 활용합니다. 음수 값의 경우. 이로 인해 질문이 촉발되었습니다. 이는 이러한 유형의 오버플로가 더 이상 정의되지 않은 동작으로 간주되지 않음을 의미합니까?

아니요, 이러한 유형의 오버플로는 C에서 정의되지 않은 동작으로 유지됩니다.

C 11 표준의 단락 5/4에 따르면 결과가 수학적으로 정의되지 않거나 유형의 표현 가능한 범위를 벗어나는 모든 표현식은 정의되지 않은 결과를 낳습니다.

int8_t, int16_t, int32_t 및 int64_t가 2의 보수를 사용하지만 이는 산술 모듈로 2^n이 적용된다는 의미는 아닙니다. 표준에는 다음과 같이 명시되어 있습니다.

"부호 없는 산술 연산의 결과는 항상 '수학적으로 정의'되고 결과는 항상 표현 가능한 범위 내에 있으므로 5/4가 적용되지 않습니다."

따라서 부호 없는 산술은 모듈로 2^n 산술 법칙을 따르며 오버플로는 정의되지 않은 동작이 아닙니다. 그러나 부호 있는 산술의 경우 오버플로는 기본 표현에 관계없이 정의되지 않은 동작으로 유지됩니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿