2012-06-25 2 views
0

나는 프로그램과 같은 * 숯불 캐스팅하는 가장 일반적인 방법은 endianity 테스트하는 것을 알고 :확인 엔디 언 프로그래밍

short temp = 0x1234; 
char* tempChar = (char*)&temp; 

를하지만이 같은 * 짧은에 캐스팅하여 수행 할 수 있습니다 :

unsigned char test[2] = {1,0}; 
if (*(short *)test == 1) 
    //Little-Endian 
else 
    //Big-Endian 

리틀 엔디안 규칙 (오른쪽에서 왼쪽으로 : "0"이 낮은 주소, "1"이 상위)을 사용하여 메모리에서 "테스트"버퍼가 메모리에 저장됩니다. "temp"var와 같은 경우?

그리고 더 일반적으로 문자열이있는 경우 문자 탭 [] = "abcdef"; 메모리에 어떻게 저장 되나요? 그것은 "fedcba"와 같이 반대가 될 것입니까?

Thx. 사전에 :-)

추신.

프로그램의 데이터가 시스템 메모리에서 정확히 어떻게 보이는지 확인할 방법이 있습니까? 리얼 엔디안에서 "실생활"의 바이트 스왑을보고 싶습니다.

+0

가능한 중복 http : // stackoverflow.com/questions/1001307/detection-endianness- 프로그래밍 방식의 C 프로그램 –

+0

PS의 경우 디버거를 사용하여 정수 유형의 변수 주소에서 메모리를 검사하십시오. 비대칭 값이있는 경우 빅 엔디 언 시스템과 리틀 엔디 언 시스템을 비교하면 메모리 내용을보고 차이점을 확인할 수 있어야합니다. – jxh

+0

1) 두 번째 예제는 정렬 오류로 인해 올바르게 엔디안 머신에서도 실패 할 수 있습니다. 2) 세계에는 2 개 이상의 엔디안이 있습니다. –

답변

2

코드가 실제로 작동 할 것입니다 (방금 시도했을 수 있습니다!). 그러나 기술적으로 정의되지 않은 동작을 호출합니다. 표준에서는 다른 유형의 포인터를 통해 문자 배열에 액세스 할 수 없습니다.

더 일반적으로 문자열이있는 경우 : char tab [] = "abcdef"; 그것이 메모리에 어떻게 저장 될까요? 그것은 "fedcba"와 같이 반대가 될 것입니까?

아니요. 그렇지 않으면 tab[0]f입니다.

+0

예, 부는 왜 나에게 말합니까 " – Mulligan

+0

@Mulligan : 언제? –

+0

ISO C++에서 정의되지 않은 동작을 피하려면 endianess를 확인할 수 없습니다. ISO C++는 스트로 지 엔디안에 대한 언급이 없습니다. –

0

엔디안을 검사하는 다른 방법이 효과적입니다.

char tab[] = "abcdef"

는 동일한 순서로 저장됩니다 : abcdef

엔디안은 여러 바이트에 액세스 할 때 활동하기 시작 (짧은, 지능 등). 작은 엔디안 머신을 사용하여 짧은 배열로 tab[]에 액세스하려고하면 ba, dc, fe (실제 바이트가 무엇인지 상관없이, 문자가 짧게 "계산"된 순서 임)로 읽습니다.

+0

그래서 혼란 스럽습니다 :-(그런 경우에는 엔디안이 바이트가 저장되는 순서를 결정합니다. get/read/accessible ??? – Mulligan

+0

예를 들어, 일부 데이터 구조에서 여러 바이트를 읽거나 쓸 때 endianness에 대해서만 신경 써야합니다 (단 하나의 바이트 만 읽으면 little 또는 big endian에서 동일합니다). – Pochi

0

두 가지 방법 모두 작동하지 않을 수 있으며, 후자는 정의되지 않은 동작을 호출합니다.

처음으로 sizeof(char) == sizeof(short)이 실패합니다.

초는 같은 이유로 실패 할 수 있으며 또한 안전하지 않습니다. 포인터 캐스트 결과가 짧게 잘못 정렬 될 수 있으며 (short) 값에 액세스하면 정의되지 않은 동작 (3.10.15)이 호출됩니다.

그러나 예, 문자 버퍼 메모리에 순차적으로 저장되어, 다른 이미 말했듯 &test[0] < &test[1], 보다 일반적으로는, char tab[] = "abcdef" 역전되거나 무관 엔디안 순열하지 않은 것.

0

공용품을 사용하는 것이 더 안전합니다. 즉 표준을 준수하는 것입니다.

+0

노조 트릭은 표준을 준수하지 않습니다. –