비트 시프트는 엔디안에 의존합니까?
내가 숫자를 'numb'=1025 [00000000 00000000 00000100 00000001]
표현 했다고 가정 해보십시오 .
리틀 엔디 언 머신에서 :
00000001 00000100 00000000 00000000
빅 엔디안 머신에서 :
00000000 00000000 00000100 00000001
이제 10 비트에 왼쪽 시프트를 적용하면 (즉 : numb << = 10) 다음을 가져야합니다.
[A] Little-Endian 머신에서 :
GDB에서 알 수 있듯이 Little Endian은 왼쪽 이동을 3 단계로 수행합니다. [처리 만 더 잘 이해하기 위해 '3'단계를 표시했습니다.]
아니오를 취급하십시오. 빅 엔디안 컨벤션에서 :
00000000 00000000 00000100 00000001
왼쪽-시프트 적용 :
00000000 00010000 00000100 00000000
Little-Endian에서 결과를 다시 나타냅니다.
00000000 00000100 00010000 00000000
[비]. 빅 엔디안 머신에서 :
00000000 00010000 00000100 00000000
내 질문은 :
리틀 엔디안 컨벤션에 직접 왼쪽 쉬프트를 적용하면 다음과 같이됩니다.
numb
:
00000001 00000100 00000000 00000000
numb << 10
:
00010000 00000000 00000000 00000000
그러나 실제로는 다음을 제공합니다.
00000000 00000100 00010000 00000000
두 번째 결과 만 달성하기 위해 위의 세 가지 가상 단계를 보여주었습니다.
위의 두 결과가 다른 이유를 설명해주십시오. 실제 결과 numb << 10
가 예상 결과와 다릅니다.
엔디안은 값이 메모리에 저장되는 방식입니다. 엔디안과 상관없이 프로세서에로드 될 때 비트 시프트 명령은 프로세서 레지스터의 값에서 작동합니다. 따라서 메모리에서 프로세서로의 로딩은 빅 엔디안으로 변환하는 것과 동일하며, 시프 팅 작업이 다음에 새로운 값이 메모리에 다시 저장되어 리틀 엔디안 바이트 순서가 다시 적용됩니다.
@jww 덕분에 업데이트 : PowerPC에서 벡터 이동 및 회전은 엔디안에 민감합니다. 벡터 레지스터에 값을 가질 수 있으며 시프트 는 little-endian 및 big-endian에서 다른 결과를 생성 합니다.
C의 다른 부분과 마찬가지로 비트 시프트는 표현이 아닌 값으로 정의됩니다 . 1만큼 왼쪽 이동은 2로 곱셈되고 오른쪽 이동은 나눗셈입니다. 비트 연산을 사용할 때와 마찬가지로 항상 서명을주의하십시오. 모든 것은 서명되지 않은 정수 유형에 대해 가장 잘 정의되어 있습니다.
어떤 시프트 명령이 더 높은 비트를 먼저 시프트하는지는 왼쪽 시프트로 간주됩니다. 어떤 시프트 명령이 하위 비트를 먼저 시프트 시키는가 올바른 시프트로 간주됩니다. 그런 의미에서의 동작 >>
과 <<
에 대한 unsigned
번호 엔디안에 의존하지 않습니다.
컴퓨터는 우리가하는 방식대로 숫자를 쓰지 않습니다. 값은 단순히 이동합니다. 바이트 단위로 보려고 주장한다면 (컴퓨터가 그렇게하는 방식은 아니지만) 리틀 엔디안 컴퓨터에서 첫 번째 바이트가 왼쪽으로 이동하고 초과 비트는 두 번째 바이트로 이동한다고 말할 수 있습니다. 등등.
(반드시, 리틀 엔디안은 더 높은 주소를 사용하여 수평이 아닌 수직으로 바이트를 쓰면 더 의미가 있습니다. 메모리 맵 다이어그램이 일반적으로 그려지는 방식입니다.)
참고 URL : https://stackoverflow.com/questions/7184789/does-bit-shift-depend-on-endianness
'development' 카테고리의 다른 글
단위 테스트 프로젝트가 대상 응용 프로그램의 app.config 파일을로드 할 수 있습니까? (0) | 2020.06.18 |
---|---|
JavaScript에서 UTC 타임 스탬프를 어떻게 얻습니까? (0) | 2020.06.18 |
여러 열에서 고유 한 sqlalchemy (0) | 2020.06.18 |
자식 자동 커밋 만들기 (0) | 2020.06.18 |
왜 슈퍼 클래스 __init__ 메소드가 자동으로 호출되지 않습니까? (0) | 2020.06.18 |