비트 연산자와 "엔디안"
엔디안 은 비트 연산에서 전혀 중요 합니까 ? 어느 쪽 의 논리 또는 이동?
비트 연산자와 관련하여 숙제를하고 있는데 앞면이나 뒷면을 만들 수없고 엔디안에 얽매이는 것 같아요. 즉, 나는 (대부분과 마찬가지로) 리틀 엔디안 머신을 사용하고 있지만 고려할 필요가 있습니까 아니면 낭비되는 사실입니까?
중요한 경우 C를 사용하고 있습니다.
엔디안은 메모리의 데이터 레이아웃에만 중요합니다. 데이터가 작동 될 프로세서에 의해로드 되 자마자 엔디안은 완전히 무관합니다. 시프트, 비트 연산 등은 엔디안에 관계없이 예상대로 수행됩니다 (데이터는 논리적으로 하위 비트에서 상위 비트로 배치됨).
비트 연산자는 엔디안을 추상화합니다. 예를 들어 >>연산자는 항상 비트를 최하위 숫자로 이동합니다. 그러나 이것이 엔디안을 사용할 때 완전히 무시해도 안전함을 의미하지는 않습니다. 예를 들어 더 큰 구조에서 개별 바이트를 처리 할 때 항상 같은 위치에 있다고 가정 할 수는 없습니다.
short temp = 0x1234;
temp = temp >> 8;
// on little endian, c will be 0x12, on big endian, it will be 0x0
char c=((char*)&temp)[0];
명확히하기 위해 나는 여기의 다른 답변에 대해 근본적으로 동의하지 않습니다. 내가 말하고자하는 요점은 비트 연산자가 본질적으로 엔디안 중립적이지만 특히 다른 연산자와 결합 할 때 코드에서 엔디안의 효과를 무시할 수 없다는 점을 강조하는 것입니다.
다른 사람들이 언급했듯이 시프트는 C 언어 사양에 의해 정의되고 엔디안과 무관하지만 오른쪽 시프트의 구현은 아키텍처가 1의 보수 또는 2의 보수 산술을 사용하는지 여부에 따라 달라질 수 있습니다.
때에 따라 다르지. 숫자를 새로운 유형으로 변환하지 않고도 엔디안을 투명하게 처리 할 수 있습니다.
그러나 작업에 새로운 유형 캐스팅이 포함 된 경우주의해야합니다.
예를 들어, 일부 비트를 오른쪽으로 시프트하고 (명시 적 으로든 아니든) 새 유형으로 캐스트하려면 엔디안이 중요합니다!
엔디안을 테스트하려면를 다음으로 캐스팅하면 int됩니다 char.
int i = 1;
char *ptr;
...
ptr = (char *) &i; //Cast it here
return (*ptr);
언어를 지정하지 않았지만 일반적으로 C 추상 엔디안과 같은 프로그래밍 언어는 비트 연산에서 멀리 떨어져 있습니다. 따라서 아니요, 비트 연산에서는 중요하지 않습니다.
참고 URL : https://stackoverflow.com/questions/1041554/bitwise-operators-and-endianness
'program story' 카테고리의 다른 글
| 객체 분해의 유형 (0) | 2020.11.14 |
|---|---|
| 규칙 엔진-장단점 (0) | 2020.11.14 |
| 설치되지 않은 RPM 패키지에 대한 정보를 표시합니까? (0) | 2020.11.14 |
| Mac OS X의 시간 초과 명령? (0) | 2020.11.14 |
| C # 함수의 매개 변수 또는 선택적 매개 변수에 기본값을 제공 할 수 있습니까? (0) | 2020.11.14 |