좌측 변속과 음의 변속 카운트
여기서 정확히 무슨 일이 일어나는 거죠?
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
'itsource' 카테고리의 다른 글
Amazon EC2 인스턴스의 MariaDB에 원격으로 연결하는 데 문제가 있습니다. (0) | 2022.09.05 |
---|---|
파일의 MD5 체크섬 생성 (0) | 2022.09.05 |
Python의 Panda와 NumPy+SciPy의 차이점은 무엇입니까? (0) | 2022.09.05 |
webpack-cli 오류: 규칙 집합을 컴파일하지 못했습니다. (0) | 2022.09.04 |
JavaScript에서 어레이를 비우려면 어떻게 해야 합니까? (0) | 2022.09.04 |