>백엔드 개발 >C++ >C와 C의 비트 단위 이동에서 정의되지 않은 동작과 구현 정의 동작의 차이점은 무엇입니까?

C와 C의 비트 단위 이동에서 정의되지 않은 동작과 구현 정의 동작의 차이점은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-08 10:36:14393검색

What's the Difference Between Undefined and Implementation-Defined Behavior in Bitwise Shifts in C and C  ?

비트 시프트의 정의되지 않은 동작과 구현에 정의된 동작

비트 왼쪽 시프트 연산자(<<)는 동작에 대한 의문을 제기합니다. 음수 왼쪽 피연산자를 사용합니다. 이 기사에서는 이 작업이 C에서는 정의되지 않은 동작을 생성하지만 C에서는 구현에 정의된 동작만 생성하는 이유를 살펴봅니다.

C의 정의되지 않은 동작

ISO C99에 따르면 음수 피연산자는 정의되지 않은 동작을 발생시킵니다. 이는 표준에 따르면 결과는 왼쪽 피연산자와 2E2의 곱이어야 하며 결과는 결과 유형 범위의 모듈로여야 한다고 규정하기 때문입니다. 그러나 왼쪽 피연산자가 음수인 경우 이러한 계산은 부호 있는 유형 컨텍스트에서 정의되지 않은 결과로 이어질 수 있습니다.

C의 잘 정의된 동작

C, C는 부호 없는 피연산자를 왼쪽으로 이동하면 예상되는 수학적 곱셈을 생성하도록 지정합니다. 그러나 부호 있는 유형의 경우 C는 결과가 결과 유형의 표현 가능한 범위를 초과하는 경우 정의되지 않은 동작도 정의합니다. 따라서 C에서 왼쪽으로 이동하는 음수 피연산자는 정의되지 않은 상태로 유지됩니다.

발산 이유

C의 접근 방식이 다른 이유는 아마도 잠재적인 오버플로로 인해 부정적인 동작이 이미 정의되지 않았습니다. 모든 부정 사례를 포함하도록 정의를 확장하면 표준이 단순화되고 정의되지 않은 동작이 명확해졌습니다.

구현 정의 오른쪽 시프트 동작

부정 피연산자를 오른쪽 시프트하는 것이 구현입니다. 부호 확장과 0 채우기 중에서 선택할 수 있기 때문에 C와 C 모두에서 정의됩니다. 부호 확장은 비워진 비트의 원래 부호 비트를 유지하는 반면, 0 채우기는 해당 비트를 0으로 대체합니다. 서로 다른 컴파일러와 플랫폼은 둘 중 하나의 동작을 선택할 수 있으므로 구현에 따라 정의되는 특성이 있습니다.

요약

C에서 음수 피연산자를 무조건 왼쪽으로 이동하면 정의되지 않은 동작이 발생합니다. . C에서는 이러한 작업이 부호 있는 유형에 대해서도 정의되지 않습니다. 반면에 음수 피연산자를 오른쪽으로 이동하는 것은 부호 확장과 0 채우기 사이의 선택으로 인해 두 언어 모두에서 구현 정의됩니다.

위 내용은 C와 C의 비트 단위 이동에서 정의되지 않은 동작과 구현 정의 동작의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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