>  기사  >  백엔드 개발  >  C에서 유형 너비를 초과하는 개수의 부호 없는 정수를 오른쪽으로 이동하는 것이 정의되지 않은 동작입니까?

C에서 유형 너비를 초과하는 개수의 부호 없는 정수를 오른쪽으로 이동하는 것이 정의되지 않은 동작입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-02 12:16:30511검색

Is Right Shifting an Unsigned Integer with a Count Exceeding its Type Width Undefined Behavior in C  ?

카운트가 유형 너비를 초과하는 오른쪽 시프트의 정의되지 않은 동작

C에서 오른쪽 시프트 연산자(>>)의 동작 표준, 특히 섹션 5.8, Shift 연산자에 정의되어 있습니다. 왼쪽 피연산자의 유형 너비보다 크거나 같은 시프트 횟수가 정의되지 않은 동작인지 여부에 대한 의문이 제기됩니다.

C 표준에서는 E1>> E2는 E1/2^E2 몫의 정수 부분입니다. 여기서 E1은 왼쪽 피연산자이고 E2는 오른쪽 피연산자입니다. 이는 E1이 부호 없는 유형이거나 음수가 아닌 값을 가진 부호 있는 유형이고 E2가 음수가 아닌 경우에만 동작이 정의된다는 것을 의미합니다.

그러나 질문은 E1이 부호 없는 유형인 경우를 고려합니다. int이고 E2는 34입니다. 이는 unsigned int의 너비 32비트를 초과합니다. 표준에서는 이 경우 동작이 정의되지 않았다고 명시적으로 명시합니다.

따라서 몫 계산에 관한 C 표준의 설명에도 불구하고 개수가 32보다 큰 부호 없는 int를 오른쪽으로 이동하는 동작은 정의되지 않습니다. 이것이 바로 GCC가 이러한 전환을 수행할 때 경고를 발행하는 이유입니다.

위 내용은 C에서 유형 너비를 초과하는 개수의 부호 없는 정수를 오른쪽으로 이동하는 것이 정의되지 않은 동작입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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