2009-06-24 5 views
63

endianness은 비트 연산과 관련이 있습니까? logical 또는 이동 중입니까?비트 연산자와 "엔디안"

저는 비트 연산자와 관련하여 숙제를하고 있으며, 머리와 꼬리를 만들 수 없으며, 엔디안에 대해 상당히 신경 쓰고 있다고 생각합니다. 즉, (대부분이 그렇듯이) 리틀 엔디 언 머신을 사용하고 있지만, 이것을 고려해야 할 필요가 있거나 낭비되는 사실입니까?

는 경우가 나는 그런 멀리 비트 연산에서 C 추상적 인 엔디 언으로 프로그래밍 언어, 일반적으로 당신은 지정하지 않은 언어를 C.

+0

중복 : http://stackoverflow.com/questions/7184789/does-bit-shift-depends-on-endianness

는 단순히 char 내로 int 전송할 수 있습니다, 당신의 엔디 언을 테스트하려면 – 0andriy

답변

65

엔디안은 메모리의 데이터 레이아웃에만 중요합니다. 처리 할 프로세서에 의해 데이터가로드되자 마자 엔디 언은 완전히 무의미합니다. 엔디안과 상관없이 이동, 비트 단위 연산 등이 예상대로 수행됩니다 (논리적으로는 하위 비트에서 상위로 데이터가 배치됩니다).

+19

논리적으로 "낮은 비트보다 높지 않아야합니까?" – legends2k

+1

@ legends2k : 같은 생각을했습니다 –

+0

@ legends2k : 예. 왼쪽 쉬프트 = 2의 거듭 제곱 곱하기 오른쪽 쉬프트 = 2의 거듭 제곱 (음수 값의 경우 정수 나누기와 다름). –

1

를 사용하고 있지만거야 문제. 따라서 비트 연산에서는 문제가되지 않습니다.

+1

질문에 개정이 없다는 것을 감안할 때, 나는 그가 언어를 언급하지 않았고, C로 태그도 붙였습니다. 당신이 놀랐다. –

+2

@Simeon : 나는이 대답을 쓸 당시 없었습니다. 작은 시간 프레임에서 단일 작성자의 편집 내용이 하나로 병합됩니다. 그것이 당신을 단일 개정판으로 보는 이유입니다. –

60

비트 연산자는 엔디안을 추상화합니다. 예를 들어, >> 연산자는 항상 비트를 최하위 자리 방향으로 이동시킵니다. 그러나이를 사용하면 엔디안을 완전히 무시하는 것이 안전하다는 의미는 아닙니다. 예를 들어 더 큰 구조의 개별 바이트를 처리 할 때 항상 동일한 위치에 있다고 가정 할 수는 없습니다.

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]; 

분명히하기 위해 나는 여기에 대한 다른 대답과 기본적으로 의견이 다르지 않습니다. 내가 강조하고자하는 점은 비트 연산자가 본질적으로 엔디안 중립적 임에도 불구하고 특히 다른 연산자와 결합 할 때 코드에서의 엔디안 효과를 무시할 수 없다는 점입니다.

+1

당신은 기본적으로 모두와 동의하지 않지만 당신의 대답은 최고로 뽑혔습니다. 행동을 어떻게 식별 할 수 있습니까? –

+0

몇 가지 추가 설명을 추가했습니다. –

+1

그래서 실제로는 바이트로 값을 검색하지 않는 한 모든 항목이 괜찮습니까? –

4

시프트는 C 언어 사양에 따라 정의되며 엔디안과는 독립적이지만 구조에서 1의 보수 또는 2의 보수를 사용하는 경우에 따라 달라질 수 있습니다.

1

다릅니다. 번호를 새로운 유형으로 변환하지 않고는 엔디안을 투명하게 처리 할 수 ​​있습니다.

그러나 작업에 새로운 유형 캐스팅이 포함 된 경우주의하십시오.

예를 들어, 일부 비트를 오른쪽으로 시프트하고 새로운 유형으로 캐스트 (명시 적으로 또는 비공유)하려는 경우 엔디안이 중요합니다!

int i = 1; 

char *ptr; 

... 

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

return (*ptr); 
+0

... 또는 공용체를 만듭니다 ...'{union {int i = 1; char a [4];} b; return b.a [3] == 1;} // 빅 엔디안' –