C programme pour vérifier peu de gros vs big endian

Duplication possible:
C Macro définition pour déterminer une grosse machine endian ou une petite machine endian?

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

Si c’est un peu endian, il s’imprimera 1. Si c’est un gros endian, il imprimera 0. Est-ce exact? Ou est-ce que mettre un caractère * à int x pointe toujours vers le bit le moins significatif, indépendamment de l’endianness?

En bref, oui.

Supposons que nous sums sur une machine 32 bits.

Si c’est peu endian, le x dans la mémoire sera quelque chose comme:

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

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

Si c’est un gros endian, ce sera:

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

alors celui-ci sera '0' .

Ce qui suit fera l’affaire.

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

Et définir &x sur char * vous permettra d’accéder aux octets individuels de l’entier, et l’ordre des octets dépendra de la nature du système.

Ceci est un gros test endian à partir d’un script de configuration :

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

Je pensais savoir que j’avais lu à ce sujet dans la norme; mais ne peut pas le trouver. Continue à regarder. Vieux; titre répondant; pas Q-tex; P:


Le programme suivant déterminera que:

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

Vous avez également cette approche ; de Quake II:

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

Et !is_big_endian() n’est pas à 100% pour être petit car il peut être mixte.

Croyez que cela peut être vérifié en utilisant la même approche que de changer la valeur de 0x01000000 à ie 0x01020304 donnant:

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

Mais pas tout à fait sûr de celui-là …