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 중국어 웹사이트의 기타 관련 기사를 참조하세요!