Duplicar posibles:
Detecting endianness programmatically in a C++ program¿Cómo puedo encontrar Endian-ness de mi PC usando programáticamente C?
¿Hay alguna función de biblioteca disponibles para encontrar la endian-dad de mi PC?
Duplicar posibles:
Detecting endianness programmatically in a C++ program¿Cómo puedo encontrar Endian-ness de mi PC usando programáticamente C?
¿Hay alguna función de biblioteca disponibles para encontrar la endian-dad de mi PC?
¿Por qué necesita una biblioteca si puede encontrarla así? :)
int num = 1;
if (*(char *)&num == 1)
{
printf("Little-Endian\n");
}
else
{
printf("Big-Endian\n");
}
No conozco una función de biblioteca.
Puede obtener la dirección de un entero, luego tratar esa dirección como un puntero de carácter y escribir datos en los bytes que componen el entero. Luego, lea lo que en realidad está en el número entero y vea si obtiene un resultado consistente con una arquitectura endian grande o little endian.
No hay una función estándar para hacerlo (como en C estándar, o estándar POSIX).
Si su PC es una PC (con Windows) que ejecuta Intel, es little-endian.
Si desea encontrar el orden de bytes en su máquina, puede utilizar el comportamiento no completamente definido (pero generalmente funciona - No he oído hablar de ningún lado que no funcione) de esta técnica:
enum { BigEndian, LittleEndian };
int endianness(void)
{
union
{
int i;
char b[sizeof(int)];
} u;
u.i = 0x01020304;
return (u.b[0] == 0x01) ? BigEndian : LittleEndian;
}
Este código supone un tipo de 32 bits int
(en lugar de 64 bits o 16 bits).
'¿Por qué no U.I. = 1; devolver u.b [0] == 1? LittleEndian: BigEndian; '? De esta manera, no tiene que preocuparse por el tamaño int. –
@MartinBonner: eso también funcionaría. –
uso este código:
union
{
uint8 c[4];
uint32 i;
} u;
u.i = 0x01020304;
if (0x04 == u.c[0])
printf("Little endian\n");
else if (0x01 == u.c[0])
printf("Big endian\n");
No necesitas "else if" - "else" es suficiente ya si no es poca endianess es una gran endianess. – Artur
@Artur: ja, ja, ja, ja! Hay otras alternativas: PDP11 usó palabras de 16 bits en orden big-endian ... con los bytes en la palabra en orden little-endian (podría haber sido viceversa, fue hace un tiempo). –
quizás explique por qué esto funciona como @Eric J. lo hace por debajo de – bjackfly
int num = 1 se almacenará como 000,0001 o 100.000 dependiendo del endianness. (char *) & num estará apuntando al primer byte de ese int. ahora si ese byte dice 1, entonces su pequeño endian es un gran endian. – hasanatkazmi
@hasanatkazmi ¿Cómo sabes si la computadora almacenará el número en 2 bytes o 4 bytes? Además, ¿por qué estás usando 7 bits de todos modos? –