2013-05-06 4 views
2
#include <stdio.h> 

union Endian 
{ 
    int i; 
    char c[sizeof(int)]; 
}; 

int main(int argc, char *argv[]) 
{ 
    union Endian e; 
    e.i = 1; 
    printf("%d \n",&e.i); 
    printf("%d,%d,\n",e.c[0],&(e.c[0])); 
    printf("%d,%d",e.c[sizeof(int)-1],&(e.c[sizeof(int)-1])); 


} 

출력 : 리틀 엔디안 또는 빅 엔디안

1567599464 
1,1567599464, 
0,1567599467 

LSB

가 낮은 주소에 저장되며 MSB가 높은 주소에 저장됩니다. 빅 엔디안이 아닌가요? 하지만 내 시스템 구성은 리틀 엔디안 아키텍처로 보여줍니다.

+0

"리틀 엔디안": 조금 먼저; "빅 엔디안": 큰쪽 끝 부분 먼저 큰 끝 부분 – pmg

+0

@tez 리틀 엔디안에서는 LSB가 하위 주소에 저장됩니다. 하위 주소는 왼쪽에서 시작하는 주소입니다. 그리고 LSB는 조잡한 의미로 가장 오른쪽 바이트입니다 수학적 바이너리 표현입니다. 그래서 가장 오른쪽의 바이트는'little-endian'의 가장 왼쪽 주소에 저장됩니다. 여러분의 아키텍쳐가'little-endian '이니? –

+1

@tez 주소를 출력 할 때마다' void *'를 사용하고'% p' 형식 지정자를 사용합니다.'% d'는 부호있는 정수의 경우처럼 순수한 no-no입니다. 주소는 서명되지 않습니다. –

답변

3

당신의 시스템은 확실히 little-endianbig-endian되어 .Had, 다음과 같은 코드입니다. little-endian 1은

00000001 00000000 00000000 00000000 
^ LSB 
^Lower Address 

로 저장되지만 big-endian에서이

00000000 00000000 00000000 00000001 
          ^LSB 
          ^Higher Address 

로 저장됩니다 그리고 %p를 사용하여 변수의 주소를 인쇄 할 %d를 사용하지 마십시오.

+0

더 많은 질문. 문자 배열에서 c [0]은 시스템 및 컴파일러에 관계없이 c [1]과 비교할 때 항상 더 낮은 주소에있게됩니까 ?? – tez

+0

@tez 예 & 아니오 !! 일반적으로 우리는 더 낮은 주소에서 더 높은 주소로 시작하는 연속적인 메모리 위치에 배열 요소가 저장 될 것으로 기대할 수 있습니다 (주소는 ** 항상 ** 연속적입니다. 그렇지 않으면 포인터 연산이 배열에서 작동하지 않습니다). Jonathan Leffer, David Pischer 또는 Mat과 같은 최고 기여자가 대답 할 수 있도록 다른 질문에 넣어야합니다. 엄격한 단어로 설명 할 수 없습니다. –

+0

@tez 질문을 게시했습니다. 링크입니다. http://stackoverflow.com/questions/16397175/are-the-elements-of-an-array-guaranteed-to-be-stored-from-lower-to-higher-addres/16397227?noredirect=1#16397227 –

2

리틀 엔디안의 경우, 최하위 비트는 첫 번째 바이트 (최하위 주소)에 저장됩니다.

당신이보고있는 무엇, 그래서 정신이 보인다

)

1

당신은 "0을 포함하는 첫 번째 요소 등) (최하위 (EC [0])와 바이트를"1 "을 포함하는 바이트가 "두 번째 것 (ec [1]). 리틀 엔디 언 맞지?

1

빅 엔디안이란 무엇이고 리틀 엔디안은 무엇인가 잘못되었습니다. 읽기 this

0

나에게 잘 어울립니다. "리틀 엔디안"(일명 "올바른 방법":-)은 "하위 바이트를 먼저 저장"한다는 것을 의미하며 이는 코드에서 보여주는 것과 정확히 같습니다. (BTW, "% p"를 사용하여 주소를 인쇄해야합니다). 최하위 주소 = "리틀 엔디안에서

+0

리틀 엔디안에게 올바른 방법을 호출하기 위해 C ' – tez

+0

-1'을 사용한 지 오래되었습니다. '% d. 온도가 5/10이라고 말하면 3 단위와 7 수는 올바른 방법이 아닙니다 :) – pmg

+1

C 배경에서 왔습니다. '(짧음) i'는'* (짧음 *) (& i) '와 같아야합니다. –

2
00000001 (Hexadecimal: 32 bits) 
^^ ^^ 
MS LS 
Byte Byte 

최하위 바이트. 정수는 메모리에 저장되고 작은 끝에서으로 시작합니다. 그러므로 이름.

printf("%d,%d,\n",e.c[0],&(e.c[0])); 

처음 %d 대신 1에 대한 0을 인쇄합니다 :

Endianness

+0

당신이 틀렸을 까봐 두려운 것입니다. 당신은 ** 비트 **에 대해 이야기하고 있습니다. ** 비트 **가 아니라 ** 비트 **와 관련된 MSB와 LSB와 같은 용어를 사용하고 있습니다. –

+0

바이트 단위의 비트 순서는 'little-endian'과 'big-endian'사이에 다르지 않습니다. 위의 그림은 완전히 잘못되었습니다. –

+0

@ Rüppell 's Vulture 나는 ** 2 ** 니블의 세트를 가리킨다. 나는 바이트가 아니라 비트를 언급하고 있었다. 더 명확하게 편집했습니다. –

관련 문제