> 백엔드 개발 > C++ > C에서 유형 너비를 초과하는 개수로 오른쪽으로 이동하면 어떻게 되나요?

C에서 유형 너비를 초과하는 개수로 오른쪽으로 이동하면 어떻게 되나요?

Patricia Arquette
풀어 주다: 2024-11-03 02:40:29
원래의
854명이 탐색했습니다.

What Happens When You Shift Right with a Count Exceeding Type Width in C  ?

카운트가 유형 너비를 초과하는 경우 오른쪽으로 이동: 정의되지 않은 동작

C에서 오른쪽 이동 연산자(>>)는 논리 또는 정수에 대한 산술 시프트 연산. 이 연산자의 동작은 일반적으로 잘 정의되어 있지만 정의되지 않은 동작으로 이어질 수 있는 특정 조건이 있습니다.

이러한 조건 중 하나는 시프트 횟수가 시프트되는 유형의 너비를 초과하는 경우입니다. C 표준에서는 "오른쪽 피연산자가 음수이거나 승격된 왼쪽 피연산자의 길이(비트)보다 크거나 같으면 동작이 정의되지 않습니다."라고 명시적으로 명시합니다.

이는 정수를 카운트만큼 이동한다는 것을 의미합니다. 피연산자가 부호 있는지 부호 없는지 여부에 관계없이 비트 너비보다 크거나 같은 것은 정의되지 않습니다. 이론적으로 이는 이러한 전환의 결과가 보장되지 않으며 구현에 따라 다를 수 있음을 의미합니다.

그러나 실제로 일부 컴파일러는 이러한 경우 특정 동작을 구현할 수 있습니다. 예를 들어, GCC는 교대 횟수가 유형 너비를 초과할 때 경고를 발행하지만 오류를 발생시키지 않습니다. 이 동작은 C 표준에 명시적으로 정의되어 있지 않으며 플랫폼마다 다를 수 있습니다.

제공된 코드 조각에서 부호 없는 정수를 34만큼 오른쪽으로 이동하는 작업이 수행됩니다.

<code class="cpp">unsigned int val = 0x0FFFFFFF;
unsigned int res = val >> 34;</code>
로그인 후 복사

C 표준에 따라 계산된 결과는 0이어야 합니다. 이동 횟수가 unsigned int 유형(일반적으로 32비트)의 너비보다 크기 때문입니다. 그러나 GCC는 경고를 표시하고 결과를 67108863으로 계산합니다.

이러한 불일치는 GCC가 이 정의되지 않은 경우에 대해 특정 동작을 구현하기 때문에 발생합니다. 생성된 어셈블리 코드는 논리적 오른쪽 시프트를 수행하고 결과를 부호 확장하지 않는 SHRL 명령을 사용합니다. 결과적으로 결과는 0이 아니라 0이 아닌 값이 됩니다.

따라서 C에서 시프트 연산을 사용할 때 시프트 횟수가 유형의 너비를 초과하지 않는지 확인하는 것이 중요합니다. 이동 중입니다. 유형 너비를 초과하면 다양한 컴파일러와 플랫폼에서 정의되지 않은 동작과 신뢰할 수 없는 결과가 발생할 수 있습니다.

위 내용은 C에서 유형 너비를 초과하는 개수로 오른쪽으로 이동하면 어떻게 되나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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