2016-07-07 4 views
2

나는 게으르며 목표 컴퓨터의 엔디 언이 내 자신과 다르다면 깨뜨릴 수있는 코드를 작성하고 싶다. 그러나 그것이 언제 깨지는 지 알고 싶습니다. 필요할 때 또는 수정할 수 있습니다.컴파일 타임에 엔디안이 결정 되었습니까?

float와 integer의 endianness가 컴파일 된 프로그램의 속성이므로 컴파일 타임에 어쨌든 확인할 수 있습니다. 아니면 내가 런타임에 주장해야 할 것인가?

+5

endianness는 * hardware *, 특히 사용 된 CPU에 의해 결정됩니다. –

+1

번호. 당신은 엔디안이 무엇인지를 미리 알아야합니다. 예 : 정수에 대한 포인터를 고려하십시오. 그 포인터가 가리키는 메모리 주소는 무엇입니까? 해당 int의 상위 바이트 또는 하위 바이트? –

+0

관련 : http://stackoverflow.com/questions/4239993/determining-endianness-at-compile-time – alk

답변

4

예, 엔디안은 문제의 시스템에 내재되어 있으며 컴파일 타임에 알려져 있습니다. 대부분의 OS에는 #define이있어 어딘가에 엔딩이 무엇인지 알려줄 것입니다.

다음과 같은 작업을 수행 할 수 있습니다, 특히 리눅스에

:

#if __BYTE_ORDER == __LITTLE_ENDIAN 
... 
#elif __BYTE_ORDER == __BIG_ENDIAN 
... 
#elif __BYTE_ORDER == __PDP_ENDIAN 
... 
#else 
... 
#endif 
+0

'.... #else # 오류 바이트 순서를 알 수 없음 # endif' – alk

+0

1+ PDP 용 ... 실행중인 Linux! :-) – alk

+1

멋진 _Linux_ 답변. 운영 체제가'# define'을 설정하지 않으면 컴파일러가 수행합니다. 정수 및 FP 엔디안의 차이를 개선하고 논의 할 수 있습니다. – chux

1

float와 integer의 endianness가 컴파일 된 프로그램의 속성이므로 컴파일 타임에 어쨌든 확인할 수 있습니까?

어떤 기계어 코드가 컴파일 될 때 결정됩니다. 프로그램은 완전히 다른 CPU 아키텍처에서 작동하는 기계 코드로 컴파일 될 수 없습니다.

현재 하드웨어에서 어떤 endianess가 사용되는지 런타임으로 확인하려면 몇 가지 방법이 있습니다.

Determining endianness at compile time도 참조하십시오. 대신 코드에서 특정 엔디안 가정에 대한 주장을 사용


, 당신은 어떤 데이터를 파일에 저장하거나 엔디안에 대한 투명한 네트워크 연결을 통해 전달하기 위해 기술을 사용합니다.

빅 엔디안 데이터 만 사용하도록 지정하고 코드는 hton<x>(), ntoh<x>() 패밀리 함수를 사용하여 데이터를 인코딩하고 디코딩합니다 (network byte order 참조).

+0

사실 며칠 전에 x86에 관한 질문이있었습니다. 그리고 가능합니다. x86 또는 PowerPC 등에서 실행될 수있는 Mac 프로그램을 생각해보십시오. 그러나 하나의 실행 파일에있는이 두 프로그램은 각각 고유 한 엔디안을 가지고 있으며 이는 CPU/플랫폼에 의해 결정됩니다. –

+1

@RudyVelthuis : x86 및 PowerPC에서 실행할 수있는 프로그램이 없습니다.이와 같이 행동하는 프로그램은 실제로 실행 파일의 두 CPU 모두에 대한 바이너리를 가지고 있으며 OS는로드하고 실행하는 "phat"실행 파일의 어느 부분을 결정합니다. 따라서 두 가지 프로그램을 실행하는 것과 같습니다. 만약 그들 중 하나가'hton ()'과 같이 endianness guarding 메커니즘없이'int '파일로 "save file"을 생성한다면, 다른 플랫폼에서 그러한 "save"를로드하는 것은 불가능합니다. 데이터의 모든 가져 오기/내보내기에 사용되는'hton ()'/ etc는 앱에서 데이터를 내보내거나 나가는 데이터가 엔디안을 고정하도록 보장합니다. – Ped7g

+1

endianness는 컴파일 타임에 * 결정되지 않습니다. 실제로, 그것은 좋아하는 텍스트 편집기를 시작하고 프로그램을 작성하기 훨씬 전에 결정됩니다. –

2

일부 하드웨어는 모두 (예를 들어 파워)을 제공합니다 ... 그러나 일반적으로 기본 모드가있다. 어쨌든, 일반적으로 컴파일 타임 어설 션이면 충분합니다.

+3

재미있는 사실, 이것을 몰랐다. _ "어쨌든, 컴파일 타임 어설 션은 일반적으로 충분합니다."_ Id는 아마도 파일 형태로 또는 네트워크를 통해 컴퓨터간에 데이터를 교환하려고한다면 _endianess transparent_code를 작성하려고합니다. –

+0

@ πάνταῥεῖ 어쩌면 당신은 _ "물론 컴파일 시간에 결정된다"_라고 대답하는 것을 고려해야합니다. –

+0

OP는 그가 엔디안을 제동 할 필요가 있다고 말하면서, 그는 좋은 이유가있을 수 있다고 말했다. –