Programma C per controllare poco contro big endian

Possibile duplicato:
C Definizione di macro per determinare la macchina big endian o little endian?

int main() { int x = 1; char *y = (char*)&x; printf("%c\n",*y+48); } 

Se è little endian, stamperà 1. Se è big endian, stamperà 0. È corretto? Oppure l’impostazione di un carattere * su int x punta sempre al bit meno significativo, indipendentemente dall’endianità?

In breve, sì.

Supponiamo di essere su una macchina a 32 bit.

Se è little endian, la x nella memoria sarà qualcosa del tipo:

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

quindi (char*)(*x) == 1 e *y+48 == '1' .

Se è big endian, sarà:

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

quindi questo sarà '0' .

Il seguente farà.

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

E l’impostazione di &x su char * consentirà di accedere ai singoli byte dell’intero e l’ordine dei byte dipenderà dalla endianità del sistema.

Questo è un grande test di endian da uno script configure :

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

Pensavo sapessi che avevo letto a riguardo nello standard; ma non riesco a trovarlo. Continua a guardare. Vecchio; rispondendo al titolo; non Q-tex; P:


Il seguente programma determinerebbe che:

 #include  #include  int is_big_endian(void) { union { uint32_t i; char c[4]; } e = { 0x01000000 }; return ec[0]; } int main(void) { printf("System is %s-endian.\n", is_big_endian() ? "big" : "little"); return 0; } 

Hai anche questo approccio ; da Quake II:

 byte swaptest[2] = {1,0}; if ( *(short *)swaptest == 1) { bigendien = false; 

E !is_big_endian() non è al 100% per essere piccolo in quanto può essere misto / medio.

Credi che questo può essere verificato utilizzando lo stesso approccio solo cambiare valore da 0x01000000 a 0x01020304 dando:

 switch(ec[0]) { case 0x01: BIG case 0x02: MIX default: LITTLE 

Ma non del tutto sicuro di quello …