Подтвердить что ты не робот

Программа C для проверки маленького и большого endian

Возможный дубликат:
C Определение макроса для определения большой конечной или малоконечной машины?

int main()
{
  int x = 1;

  char *y = (char*)&x;

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

Если это немного endian, он будет печатать 1. Если он большой endian, он будет печатать 0. Правильно ли это? Или будет ли установка char * на int x всегда указывать на младший значащий бит независимо от его сущности?

4b9b3361

Ответ 1

Короче говоря, да.

Предположим, что мы находимся на 32-битной машине.

Если это немного endian, x в памяти будет выглядеть примерно так:

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

so (char*)(*x) == 1 и *y+48 == '1'.

Если это большой конец, это будет:

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

так что это будет '0'.

Ответ 2

Выполняется следующее.

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

И установка &x в char * позволит вам получить доступ к отдельным байтам целого числа, а порядок байтов будет зависеть от сущности системы.

Ответ 3

Это большой эндианский тест из configure script:

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

Ответ 4

Думал, что знаю, что я читал об этом в стандарте; но не может его найти. Смотрит. Старый; ответный заголовок; не 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 до i.e. 0x01020304, дающее:

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

Но не совсем уверен в этом...