>백엔드 개발 >C++ >왜 왼쪽 이동 음수는 C에서는 정의되지 않았지만 C에서는 (주의사항과 함께) 정의되어 있습니까?

왜 왼쪽 이동 음수는 C에서는 정의되지 않았지만 C에서는 (주의사항과 함께) 정의되어 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-10 01:21:141000검색

Why is Left Shifting Negative Numbers Undefined in C but Defined (with caveats) in C  ?

C에서는 음수 값에 대해 왼쪽 Shift가 정의되지 않았지만 C에서는 잘 정의되어 있는 이유는 무엇입니까?

ISO C99 및 C 표준은 고유한 동작을 지정합니다. 음수 값에 대한 왼쪽 시프트 연산의 경우. C에서 음수 값을 이동하면 ISO C99 표준 섹션 6.5.7/4에 따라 정의되지 않은 동작(UB)이 호출됩니다. 이는 정의가 음수가 아닌 값에 대한 결과만 명확하게 기술하고 음수 값에 대한 동작을 정의하지 않았기 때문입니다.

그러나 ISO C -03 표준(섹션 5.8/2)은 부호 있는 유형에 대한 동작을 명시적으로 정의합니다. . 이동된 값이 결과 유형 내에서 표시될 수 있으면 반환됩니다. 그렇지 않으면 정의되지 않은 동작이 호출됩니다.

왜 왼쪽 Shift에 대한 정의되지 않은 동작이 음수에 있나요?

왼쪽 Shift 작업에 대한 ISO C99 정의에서는 어떤 일이 발생하는지 지정하지 않습니다. 시프트될 때 음수 값의 상위 비트를 사용합니다. 이로 인해 수행할 작업을 결정하는 것은 구현에 달려 있으며, 이로 인해 다르거나 잘못된 결과가 발생할 수 있습니다. 컴파일러 전체에서 일관된 동작을 보장하기 위해 정의되지 않은 동작이 기본값입니다.

왜 구현 정의 동작은 음수에서 오른쪽 시프트에 대해 정의됩니까?

왼쪽 시프트 연산과 대조적 , 오른쪽 시프트 작업은 왼쪽에서 잘림을 처리할 필요가 없습니다. 결과적으로 구현 시 음수 값에 대한 일관된 동작을 정의하는 것이 더 쉽습니다. 이 동작은 컴파일러와 시스템에 따라 다를 수 있지만 일반적으로 산술(C의 부호 있는 오른쪽 시프트와 유사) 또는 논리(결과는 0)입니다.

결론

C와 C에서 음수 값에 대한 왼쪽 및 오른쪽 시프트 연산의 동작이 다른 이유는 주로 구현의 용이성 때문입니다. 오른쪽 시프트는 크게 복잡하지 않고 음수 값에 대해 일관되게 정의할 수 있는 반면, 왼쪽 시프트는 비트를 자르거나 이식할 수 없는 결과를 지정해야 하므로 컴파일러 전체에서 일관되지 않은 동작이 발생합니다.

위 내용은 왜 왼쪽 이동 음수는 C에서는 정의되지 않았지만 C에서는 (주의사항과 함께) 정의되어 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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