program story

비트 연산자와 "엔디안"

inputbox 2020. 11. 14. 10:12
반응형

비트 연산자와 "엔디안"


엔디안 은 비트 연산에서 전혀 중요 합니까 ? 어느 쪽 의 논리 또는 이동?

비트 연산자와 관련하여 숙제를하고 있는데 앞면이나 뒷면을 만들 수없고 엔디안에 얽매이는 것 같아요. 즉, 나는 (대부분과 마찬가지로) 리틀 엔디안 머신을 사용하고 있지만 고려할 필요가 있습니까 아니면 낭비되는 사실입니까?

중요한 경우 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

반응형