> 백엔드 개발 > C++ > GCC가 과도한 교대 횟수를 사용하는 오른쪽 교대 작업에서 정의되지 않은 동작을 생성하는 이유는 무엇입니까?

GCC가 과도한 교대 횟수를 사용하는 오른쪽 교대 작업에서 정의되지 않은 동작을 생성하는 이유는 무엇입니까?

DDD
풀어 주다: 2024-11-02 09:21:02
원래의
164명이 탐색했습니다.

Why Does GCC Produce Undefined Behavior in Right Shift Operations with Excessive Shift Counts?

교대 횟수가 과도한 오른쪽 Shift 연산의 정의되지 않은 동작

C 표준에서 오른쪽 Shift 연산의 동작은 음수가 아닌 Shift 횟수에 대해 잘 정의되어 있습니다. 그러나 시프트 횟수가 시프트되는 유형의 너비를 초과하면 동작이 정의되지 않은 것으로 간주됩니다.

다음 코드를 고려하세요.

<code class="cpp">unsigned int val = 0x0FFFFFFF;
unsigned int res = val >> 34; // res should be 0 by C++ standard</code>
로그인 후 복사

C 표준에 따르면 34는 음수가 아닌 경우 결과 값 res는 0이어야 합니다. 그러나 GCC는 이 코드 조각에 대해 경고를 발생시키고 0이 아닌 결과를 생성합니다.

이 경우 GCC의 동작은 다음에서 발췌한 내용으로 설명할 수 있습니다. 초안 C 표준 섹션 5.8 시프트 연산자:

결과 유형은 승격된 왼쪽 피연산자의 유형입니다. 오른쪽 피연산자가 음수이거나 승격된 왼쪽 피연산자의 길이(비트)보다 크거나 같은 경우 동작은 정의되지 않습니다.

이 경우, unsigned int가 32비트 이하이면 이동 횟수 34가 승격된 왼쪽 피연산자의 너비를 초과합니다. 따라서 동작은 정의되지 않았으며 GCC의 경고는 정당합니다.

이 맥락에서 정의되지 않은 동작은 정의되지 않은 값을 참조하지 않는다는 점에 유의하는 것이 중요합니다. 대신 이는 동작이 구현에 따라 정의되며 다양한 컴파일러와 플랫폼에 따라 다를 수 있음을 의미합니다. 이 경우 Intel 플랫폼에서의 GCC 동작은 C 표준의 기대치와 일치하지 않습니다.

위 내용은 GCC가 과도한 교대 횟수를 사용하는 오른쪽 교대 작업에서 정의되지 않은 동작을 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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