J'étudie big and little-endianness.Pour comprendre un code C sur l'endianness
1. Quel est l'objet de | \
dans le code suivant?
...
#elif defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)
#define htons(A) ((((uint16_t)(A) & 0xff00) >> 8) | \
(((uint16_t)(A) & 0x00ff) << 8))
...
2. Quel est le but de (A)
dans le code?
Merci pour vos réponses! –
Vous n'avez pas besoin de masque & 0xff00 ou & 0x00ff - dans le premier cas, les 8 bits inférieurs sont masqués car ils se décalent vers le bas. Dans le second cas, les bits débordent et sont perdus. (uint16_t) (((uint16_t) (A) >> 8) | ((uint16_t) (A) << 8))) aurait le même résultat –
@ Tom Leys est en désaccord sur le 2ème cas. '(((uint16_t) (A)) << 8))'. 'A' est converti en' uint16_t' en conservant ses 16 LSbits. Ensuite, on pense aux promotions entières habituelles qui peuvent être à un int de 32 bits par exemple. Alors cette valeur est décalée 8. Peu probable ce que l'OP désirait. – chux