Development Tip

리틀 엔디안과 빅 엔디안을 확인하는 C 프로그램

yourdevel 2020. 12. 3. 20:40
반응형

리틀 엔디안과 빅 엔디안을 확인하는 C 프로그램


중복 가능성 :
빅 엔디안 또는 리틀 엔디안 머신을 결정하는 C 매크로 정의?

int main()
{
  int x = 1;

  char *y = (char*)&x;

  printf("%c\n",*y+48);
}

리틀 엔디안이면 1을 인쇄합니다. 빅 엔디안이면 0을 인쇄합니다. 맞습니까? 아니면 char *를 int x로 설정하면 엔디안에 관계없이 항상 최하위 비트를 가리킬까요?


요컨대, 그렇습니다.

32 비트 컴퓨터에 있다고 가정 해 보겠습니다.

리틀 엔디안 인 x경우 메모리는 다음과 같습니다.

       higher memory
          ----->
    +----+----+----+----+
    |0x01|0x00|0x00|0x00|
    +----+----+----+----+
    A
    |
   &x

이렇게 (char*)(&x) == 1하고 *y+48 == '1'.

빅 엔디안이면 다음과 같습니다.

    +----+----+----+----+
    |0x00|0x00|0x00|0x01|
    +----+----+----+----+
    A
    |
   &x

그래서 이것은 '0'.


다음이 수행됩니다.

unsigned int x = 1;
printf ("%d", (int) (((char *)&x)[0]));

그리고 설정 &x하려면 char *정수의 개별 바이트에 액세스 할 수있게되며, 바이트의 순서는 시스템의 엔디안에 따라 달라집니다.


다음은 구성 스크립트의 빅 엔디안 테스트입니다 .

#include <inttypes.h>
int main(int argc, char ** argv){
    volatile uint32_t i=0x01234567;
    // return 0 for big endian, 1 for little endian.
    return (*((uint8_t*)(&i))) == 0x67;
}

내가 그것에 대해 표준에서 읽었다는 것을 알고 있다고 생각했습니다. 하지만 찾을 수 없습니다. 계속 찾고 있습니다. 낡은; 응답 제목; Q-tex가 아님; P :


다음 프로그램은 다음을 결정합니다.

#include <stdio.h>
#include <stdint.h>

int is_big_endian(void)
{
    union {
        uint32_t i;
        char c[4];
    } e = { 0x01000000 };

    return e.c[0];
}

int main(void)
{
    printf("System is %s-endian.\n",
        is_big_endian() ? "big" : "little");

    return 0;
}

이 접근 방식 도 있습니다 . Quake II에서 :

byte    swaptest[2] = {1,0};
if ( *(short *)swaptest == 1) {
    bigendien = false;

그리고 !is_big_endian()혼합 / 중간이 될 수 있기 때문에 100 %가되지 않습니다.

이것은 단지에서 값을 변경 동일한 방법을 사용하여 확인할 수 있습니다 믿어 0x01000000즉을 0x01020304제공 :

switch(e.c[0]) {
case 0x01: BIG
case 0x02: MIX
default: LITTLE

그러나 그것에 대해 완전히 확신하지는 못합니다 ...

참고 URL : https://stackoverflow.com/questions/12791864/c-program-to-check-little-vs-big-endian

반응형