Petit Endian Vs Big Endian

Disons que j’ai un entier de 4 octets et que je veux le transtyper en un entier court de 2 octets. Ai-je raison de dire que dans les deux (petit et grand endian) entier court sera composé de 2 octets les moins significatifs de cet entier de 4 octets?

Deuxième question:
Quel sera le résultat d’un tel code dans les processeurs little endian et big endian?

int i = some_number; short s = *(short*)&i; 

IMHO dans le processeur big endian 2 octets les plus significatifs seraient copiés, et dans little endian 2 octets les moins significatifs seraient copiés.

Ai-je raison de dire que dans les deux entiers courts, il y aura 2 octets de poids faible de cet entier de 4 octets?

Oui, par définition

La différence entre bigE et littleE est de savoir si l’octet le moins significatif est à l’adresse la plus basse ou non. Sur un petit processeur endian, les adresses les plus basses sont les bits les moins significatifs, x86 le fait de cette façon.

Ceux-ci donnent le même résultat sur le petit E.

 short s = (short)i; short s = *(short*)&i; 

Sur un processeur big endian, les adresses les plus élevées sont les bits les moins significatifs, 68000 et Power PC le font de cette manière (en fait, Power PC peut être les deux, mais les machines PPC de Apple utilisent bigE)

Ceux-ci donnent le même résultat sur le grand E.

 short s = (short)i; short s = ((short*)&i)[1]; // (assuming i is 4 byte int) 

Ainsi, comme vous pouvez le constater, little endian vous permet d’obtenir au moins les bits les plus significatifs d’un opérande sans connaître sa taille . little E présente des avantages pour la préservation de la compatibilité ascendante.

Alors, quel est l’avantage du big endian? Cela crée des images hexadécimales plus faciles à lire.

En réalité, les ingénieurs de Motorola pensaient qu’il était plus important d’alléger la lecture des images hexadécimales que la compatibilité avec les versions antérieures. Les ingénieurs d’Intel ont cru le contraire.

  1. Oui. Lorsque vous convertissez des valeurs, vous n’avez pas à vous soucier de l’endianisme.

  2. Oui. Lorsque vous convertissez des pointeurs, vous le faites.

Tout d’abord, vous le savez peut-être déjà, mais laissez-moi vous dire que la taille de int n’est pas garantie de 4 octets et que celle de short, 2 octets sur toutes les plateformes.

Si dans votre première question, vous entendez quelque chose comme ceci:

 int i = ...; short s = (short)i; 

alors oui, s contiendra le ou les octets inférieurs de i .

Je pense que la réponse à votre deuxième question est également oui; au niveau des octets, l’endianité du système entre en jeu.

Vous devriez être conscient que votre deuxième exemple

 int i = some_number; short s = *(short*)&i; 

n’est pas un code C valide car il enfreint les règles ssortingctes en matière de crénelage. Il est susceptible d’échouer sous certains niveaux d’optimisation et / ou compilateurs.

Utilisez les syndicats pour cela:

 union { int i; short s; } my_union; my_union.i = some_number; printf("%d\n",my_union.s); 

En outre, comme d’autres l’ont fait remarquer, vous ne pouvez pas supposer que votre contenu sera de 4 octets. Utilisez mieux int32_t et int16_t lorsque vous avez besoin de tailles spécifiques.

Si vous voulez vraiment convertir un int en court-métrage, faites simplement cela:

 short int_to_short(int n) { if (n < SHRT_MIN) return SHRT_MIN; if (n > SHRT_MAX) return SHRT_MAX; return (short)n; } 

Vous n’avez même pas à vous soucier de endian, le langage le gère pour vous. Si vous êtes certain que n se situe dans la fourchette d’un court-métrage, vous pouvez également ignorer la vérification.