itsource

좌측 변속과 음의 변속 카운트

mycopycode 2022. 9. 5. 23:16
반응형

좌측 변속과 음의 변속 카운트

여기서 정확히 무슨 일이 일어나는 거죠?

a << -5

확실히 그것은 오른쪽으로 이동하지 않는다.하지만 내가 읽고 있는 책에는 이렇게 쓰여 있다.

하나의 기계에서 이 식은 실제로 27비트의 왼쪽 시프트를 수행합니다.

내 질문은, 왜?왜 27비트의 좌측 시프트가 발생합니까?그리고 음의 변속 카운트를 사용하여 변속하면 정확히 어떤 일이 발생합니까?감사합니다.

오른쪽에 있는 음의 정수는 C 언어에서 정의되지 않은 동작입니다.

ISO 9899:2011 6.5.7 비트 단위 시프트 연산자:

정수 프로모션은 각 오퍼랜드에서 실행됩니다.결과의 유형은 승격된 왼쪽 피연산자의 유형입니다.오른쪽 피연산자의 값이 음수이거나 승격된 왼쪽 피연산자의 폭 이상일 경우 동작은 정의되지 않습니다.

다른 멤버가 이미 응답한 것처럼 정의되지 않은 동작을 생성합니다.여기서 언급하고 싶은 것은, ("On one machine"에서)의 인용은 부분적인 것 같습니다.동작을 일반화하지 않습니다.이 책은 또한 그 행동이 표준에 따라 정의되지 않았다고 설명했을 수도 있다.덧붙여서, 나는 "The New C Standard - An Economic and Cultural Commentary"를 읽고 있었는데, 다음과 같은 진술을 발견했다.

인텔 Pentium SAL 명령(gcc와 Microsoft C++ 모두 왼쪽 시프트를 평가하기 위해 생성)은 시프트 양의 하위5비트만 사용합니다.

이것은 왜 -5의 왼쪽 시프트가 27의 왼쪽 시프트가 될 수 있는지를 잘 설명해 줍니다(2의 음수 보완 표현).

동작은 정의되어 있지 않습니다.

5비트 바이너리 산술에서, 2's-completment -5는 부호 없는 +27과 같은 바이너리 표현을 가지고 있으며, 이것이 아마도 특정 플랫폼을 설명해 줄 것입니다.

시프트하는 값이 32비트 변수인 경우 시프트 -5는 "루프"에 들어가 27을 앞으로 이동합니다.이동은 "서명되지 않은" 방식으로만 이루어질 수 있습니다.

int main()
{
    unsigned int a = 1;
    printf("%u\n",a<<(-1));
    return 0;
}

출력은 2147483648 입니다.

제 가정과 검증은 다음과 같습니다. (그냥 가정!)

1. "<" 오른쪽 오퍼랜드는 부호 없는 int 타입이어야 합니다.

따라서 (int) "-1"은 (int) "-1"에 캐스팅됩니다.Cause int type은 2의 보완 표현이며 결과는 2^32-1(부호되지 않은 int)입니다.

2. 2^32-1이 최대 변위 자리보다 크기 때문에 2^32-1은 mod 32가 되며, 이는 27과 같습니다.

다른 nagetive right 피연산자 번호도 시험해 보았습니다만, 가정된 룰에 의한 수동 계산 결과는 IDE에 의한 제품과 동일합니다.

나는 내 추측이 맞는지 아닌지를 증명할 수 있는 몇 가지 공식 문서를 찾고 있다.나한테 말해줄 수 있을 거야.

언급URL : https://stackoverflow.com/questions/4945703/left-shifting-with-a-negative-shift-count

반응형