Union et endianité

typedef union status { int nri; char cit[2]; }Status; int main() { Status s; s.nri = 1; printf("%d \n",s.nri); printf("%d,%d,\n",s.cit[0],s.cit[1]); } 

SORTIE:

 1 0,1 

Je sais que cette sortie sur la deuxième ligne dépend de l’endianess de la CPU. Comment puis-je écrire un tel programme dans un programme indépendant de la plate-forme? Existe-t-il un moyen de vérifier l’endurance de la CPU?

Vous pouvez utiliser htonl() et / ou ntohl() . htonl() signifie “hôte sur réseau long”, tandis que ntohl() signifie “réseau à héberger long”. “Hôte” et “réseau” se rapportent à l’ordre des octets. L’ordre des octets du réseau est “big-endian”. Les opérations seront sans faille si la plate-forme hôte est également “big-endian”. En utilisant ces routines, le programme suivant générera toujours le même résultat:

 uint32_t x = htonl(1); unsigned char *p = (void *)&x; printf("%u %u %u %u\n", p[0], p[1], p[2], p[3]); uint32_t y = ntohl(x); assert(y == 1); 

Si vous voulez du code indépendant de Endian, vous voulez également du code indépendant de la plate-forme, sinon vos exigences n’auront aucun sens. Un code qui ne repose pas sur endianess ne peut pas s’appuyer sur la taille d’un int ni sur la signature de char.

Pour obtenir quelque chose de vraiment portable, je suppose que vous devriez écrire quelque chose de similaire à ceci:

 #include  #include  #define INT_BITS (sizeof(int) * 8) #define BYTE0_MASK (0xFFu << (INT_BITS - 8)) #define BYTE1_MASK (0xFFu << (INT_BITS - 16)) int main() { int i = 0xAABBCCDD; unsigned char arr [2] = { (i & BYTE0_MASK) >> (INT_BITS - 8), (i & BYTE1_MASK) >> (INT_BITS - 16) }; printf("%x %x", arr[0], arr[1]); } 

L’endianisme n’est généralement pas un problème si votre programme ne communique pas avec un autre programme (y compris le même programme écrit pour une autre plate-forme), à ​​moins que vous ne fassiez quelque chose de très spécial comme le syndicat défini dans votre question. Lorsque votre programme communique avec d’autres programmes, comme la sauvegarde de données binarys dans un fichier, l’envoi de données dans un socket, il est préférable de définir clairement le format / protocole. Alternativement, vous pouvez également transmettre les données sous forme textuelle.