programing

체크하는 C 프로그램 vs 빅 엔디안

prostudy 2022. 4. 25. 21:39
반응형

체크하는 C 프로그램 vs 빅 엔디안

중복 가능:
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'. (48은 '0'의 아스키 코드)

빅 엔디안이라면 다음과 같다.

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

그래서 이번은'0'.

다음과 같이 하면 된다.

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

그리고 설정&xchar *정수의 개별 바이트에 액세스할 수 있으며, 바이트 순서는 시스템의 엔디안성에 따라 달라진다.

구성 스크립트의 빅 엔디안 테스트:

#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;
}

당신은 또한 이런 접근법을 가지고 있다; 퀘이크 2:

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

반응형