c - network - little endian and big endian pdf
Programa de C para chequear Little vs. Big Endian (4)
Posible duplicado:
¿Definición de la macro C para determinar la máquina big endian o little endian?
int main()
{
int x = 1;
char *y = (char*)&x;
printf("%c/n",*y+48);
}
Si es little endian imprimirá 1. Si es big endian imprimirá 0. ¿Es correcto? ¿O si el ajuste de un char * a int x siempre apunta al bit menos significativo, independientemente de la endianidad?
En resumen, sí.
Supongamos que estamos en una máquina de 32 bits.
Si es little endian, la x
en la memoria será algo como:
higher memory
----->
+----+----+----+----+
|0x01|0x00|0x00|0x00|
+----+----+----+----+
A
|
&x
entonces (char*)(&x) == 1
, y *y+48 == ''1''
.
Si es big endian, será:
+----+----+----+----+
|0x00|0x00|0x00|0x01|
+----+----+----+----+
A
|
&x
así que este será ''0''
.
Esta es la prueba big endian de un script de configure :
#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;
}
Lo siguiente hará.
unsigned int x = 1;
printf ("%d", (int) (((char *)&x)[0]));
Y la configuración de &x
a char *
le permitirá acceder a los bytes individuales del entero, y el orden de los bytes dependerá de la naturaleza del sistema.
Pensé que sabía que había leído sobre eso en la norma; pero no puedo encontrarlo Sigue buscando. Antiguo; encabezado de respuesta no Q-tex; P:
El siguiente programa determinaría que:
#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;
}
Usted también tiene este enfoque ; de Quake II:
byte swaptest[2] = {1,0};
if ( *(short *)swaptest == 1) {
bigendien = false;
Y !is_big_endian()
no es 100% para ser poco ya que puede ser mezclado / medio.
Creo que esto se puede verificar usando el mismo enfoque, solo cambie el valor de 0x01000000
a 0x01020304
dando:
switch(e.c[0]) {
case 0x01: BIG
case 0x02: MIX
default: LITTLE
Pero no estoy completamente seguro de eso ...