programing

비트 연산자와 "엔디안니스"

bestcode 2022. 8. 14. 12:03
반응형

비트 연산자와 "엔디안니스"

비트 단위 연산에 엔디안성이 문제가 됩니까?논리적입니까, 아니면 전환적입니까?

저는 비트 연산자에 대해 숙제를 하고 있는데, 무슨 말인지 전혀 알 수 없고, 엔디안스에 상당히 집착하고 있는 것 같습니다.즉, 저는 (대부분과 마찬가지로) 작은 엔디언 머신을 사용하고 있습니다만, 이것은 고려할 필요가 있습니까, 아니면 낭비입니까?

혹시 모르니까 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 추상적 엔디안니스와 같은 프로그래밍 언어는 비트 단위 연산에서 사라집니다.따라서 비트 단위 운영에서는 문제가 되지 않습니다.

사정에 따라 다르겠지.새로운 타입에 번호를 입력하지 않고 엔디안니스 처리를 투명하게 할 수 있습니다.

그러나 작업에 새로운 유형의 주물이 포함되어 있다면 주의해야 합니다.

예를 들어 일부 비트와 캐스트를 새 유형으로 오른쪽 이동하려면(명시 여부에 관계없이) 엔디안성이 중요합니다!

내향성을 테스트하기 위해, 간단히 캐스팅을 하면 됩니다.intchar:

int i = 1;

char *ptr;

...

ptr = (char *) &i;  //Cast it here

return  (*ptr);

다른 사람들이 언급했듯이, 이동은 C 언어 사양에 의해 정의되고 엔디안으로부터 독립적이지만, 오른쪽 이동의 구현은 아키텍처가 하나의 보완 산수를 사용하는지 또는 두 개의 보완 산수를 사용하는지에 따라 달라질 수 있다.

언급URL : https://stackoverflow.com/questions/1041554/bitwise-operators-and-endianness

반응형