>  기사  >  백엔드 개발  >  C에서 (1 >> 32)가 1을 반환하는 이유: 오른쪽 시프트 연산자 동작 및 정의되지 않은 동작에 대한 심층 분석

C에서 (1 >> 32)가 1을 반환하는 이유: 오른쪽 시프트 연산자 동작 및 정의되지 않은 동작에 대한 심층 분석

Barbara Streisand
Barbara Streisand원래의
2024-10-27 13:48:01695검색

Why Does (1 >> 32) Return 1 in C: 오른쪽 Shift 연산자 동작과 정의되지 않은 동작에 대한 심층 분석? 
> 32) C에서 1 반환: 오른쪽 Shift 연산자 동작과 정의되지 않은 동작에 대한 심층 분석? " />

오른쪽 쉬프트 연산자(1>32)에 대한 궁금증

에서 오른쪽 쉬프트 연산자(>>)를 활용하면 C 코드에서는 피연산자 너비보다 크거나 같은 값으로 이동하면 0이 된다고 가정하는 경우가 많습니다. 그러나 제공된 코드 조각에서 알 수 있듯이 이 가정으로 인해 예기치 않은 동작이 발생할 수 있습니다.

foo(a, b) 함수는 정수 a를 b 비트만큼 이동합니다. 인수(1, 32)를 사용하여 호출하면 놀랍게도 예상된 0 대신 1을 반환합니다. 이 동작은 상수 표현식 1>> 32, 여기서는 C 표준에 설명된 정의되지 않은 동작으로 인해 0으로 평가됩니다.

반대로, bar(a, b) 함수는 64비트 부호 없는 정수에 대해 작동하며 올바르게 반환합니다. 32비트만큼 이동하면 64가 32보다 커서 0이 생성되기 때문입니다. 그러나 막대의 경우에도 64비트만큼 이동하면 여전히 1이 반환될 수 있습니다.

이 동작을 자세히 설명하면 시프트 작업의 하드웨어 구현은 시프트 수를 5 또는 6비트(아키텍처에 따라 다름)로 마스크하여 32 또는 63보다 크거나 같은 모든 시프트 수를 효과적으로 자릅니다. 따라서 특정 아키텍처의 LSR(논리적 오른쪽 시프트)은 다음을 보장합니다. ≥32로 이동하면 항상 0이 생성됩니다.

이는 32비트 정수를 ≥32로 이동하는 것이 이식 불가능하다는 점을 강조합니다. 결과는 기본 하드웨어 구현에 따라 달라질 수 있기 때문입니다.

위 내용은 C에서 (1 >> 32)가 1을 반환하는 이유: 오른쪽 시프트 연산자 동작 및 정의되지 않은 동작에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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