Программа C для проверки маленького и большого endian
Возможный дубликат:
C Определение макроса для определения большой конечной или малоконечной машины?
int main()
{
int x = 1;
char *y = (char*)&x;
printf("%c\n",*y+48);
}
Если это немного endian, он будет печатать 1. Если он большой endian, он будет печатать 0. Правильно ли это? Или будет ли установка char * на int x всегда указывать на младший значащий бит независимо от его сущности?
Ответы
Ответ 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
Но не совсем уверен в этом...