L'endianité peut-elle se référer à l'ordre de bits dans un octet?
je suis en train de lire "l'Apprentissage Core Audio: Un Guide pratique pour les programmes Audio pour Mac et iOS" par Chris Adamson et à un moment, l'auteur décrit big-endian:
les parties hautes d'un octet ou d'un mot sont numériquement plus significatives que les parties inférieures.
cependant, jusqu'à présent je croyais que le problème de Big-little endian ne s'applique qu'à byte ordre et pas bit ordre. Un octet a le même bit ordre (de gauche à droite) Peu importe si nous parlons de petits ou grands systèmes endian. Suis-je tort? Est l'auteur du mal? Ou Ai-je mal compris son point de vue?
5 réponses
puisque vous ne pouvez pas normalement adresser les bits à l'intérieur d'un octet individuellement, il n'y a pas de concept de" endianité de bit " en général.
Le seul sens dans lequel il ya une telle chose comme "bit" est l'ordre dans lequel les bits sont affectés à bitfields. Par exemple, dans:
union {
struct {
unsigned char a:4;
unsigned char b:4;
} bf;
unsigned char c;
};
selon la mise en œuvre, la représentation de bf.a
pourrait occuper les quatre bits supérieurs de c
, ou les quatre bits inférieurs de c
. Si l'ordre des membres bitfield correspond à l'ordre des octets est défini par l'implémentation.
il ne s'agit pas d'une réponse à la question posée - elle a déjà été bien répondu par d'autres -, mais d'une note de bas de page expliquant certains termes dans l'espoir qu'elle clarifiera les concepts connexes. En particulier, cela n'est pas spécifique à c du tout.
-
Stockage et l'ordre des octets de
Lorsqu'une valeur supérieure à byte est stockée ou sérialisée en octets multiples , le choix de l'ordre dans lequel les octets composants sont stockés est appelé ordre d'octets , ou endian , ou endianness .
historiquement, il y a eu trois ordres de byte en usage: big-endian " , " little-endian , et PDP-endian " ou " moyen-endian " .
Big-endian et little-endian l'ordre des octets de noms sont dérivés de la façon dont ils l'ordre des octets: big-endian met l'octet le plus significatif (l'octet qui affecte la valeur logique plus) tout d'abord, successifs, les octets dans l'ordre décroissant d'importance; et little-endian met l'octet le moins significatif en premier, avec des octets successives par ordre croissant d'importance.
notez que l'ordre des octets peut différer pour les types entiers et les types à virgule flottante ; ils peuvent même être implémentés dans des unités matérielles distinctes. Sur la plupart du matériel, ils ont le même ordre de octet, cependant.
-
ordre des Bits
ordre de bits est très similaire concept à endianness, sauf qu'il implique des bits individuels plutôt que des octets. Les deux concepts sont liés, mais pas la même.
L'ordre de bits n'est significatif que lorsque les bits sont sérialisés, par exemple via un bus série ou SPI ou I 2 c; l'un après l'autre.
lorsque des bits sont mentionnés dans un groupe plus grand utilisé en parallèle, comme une unité , comme dans un octet ou un mot, il n'y a pas d'ordre: il n'y a que étiquetage et "1519180920 de" signification . (C'est parce qu'ils sont utilisés et manipulés en tant que groupe, en parallèle plutôt qu'en série, un par un, qu'il n'y a pas d'ordre spécifique. Leur interprétation en tant que groupe donne une signification différente à chacun, et les humains américains peuvent les étiqueter ou les numéroter pour la facilité de la référence.)
-
Peu d'importance
quand un groupe de bits sont considéré comme une valeur binaire , il y a un bit le moins significatif , et un bit le plus significatif . Ces noms sont dérivés du fait que si vous changez le bit le moins significatif, la valeur du groupe bit change par la plus petite quantité possible; si vous changez le bit le plus significatif, la valeur du groupe bit change par la plus grande quantité possible (par un simple changement de bit).
disons que vous avez un groupe de cinq bits, dire un , b , c , d , et e , qui forme un des cinq bits entier non signé valeur. Si a est le plus significatif, et e le moins significatif, et les trois autres sont dans l'ordre décroissant de signification, la valeur entière non signée est
valeur = un ·2 4 + b ·2 3 + c ·2 2 + d ·2 1 + e ·2 0
c'est à dire
valeur = 16 un + 8 b + 4 c + 2 d + een d'autres termes, bit significance est dérivé de l'interprétation mathématique (ou logique) d'un groupe de bits, et est complètement séparé de l'ordre dans lequel les bits pourraient être sérialisés sur un bus, et aussi de n'importe quelles étiquettes ou nombres assignés par l'homme.
ceci est vrai pour tous les groupes de bits qui construisent logiquement des valeurs numériques, même pour à virgule flottante numéros.
-
étiquettes de bits ou numérotation de bits
par exemple, pour faciliter la consultation de la documentation, il est souvent utile d'étiqueter les bits individuels. Ceci est essentiellement arbitraire; et en effet, j'ai utilisé les lettres a à f dans un exemple ci-dessus. Plus souvent, les nombres sont plus faciles que lettres-il n'est pas si facile d'étiqueter plus de 27 bits avec des lettres simples.
il y a deux façons d'étiqueter les bits avec des nombres.
le plus courant actuellement est d'étiqueter les bits en fonction de leur signification, le bit 0 se référant au bit le moins significatif. C'est utile, car le bit i a alors la valeur logique 2 i .
sur la documentation de certaines architectures, comme la documentation POWER D'IBM, le bit le plus significatif est étiqueté 0, par ordre décroissant de signification. Dans ce cas, la valeur logique d'un bit dépend du nombre de bits dans cette unité. Si une unité a n bits, alors le bit i a une valeur logique de 2 N -i-1 .
bien que cet ordre puisse sembler étrange, ces architectures sont tous big-endian, et il pourrait être utile pour les humains de simplement se rappeler / supposer que le plus significatif vient en premier sur ces systèmes.
rappelez-vous, cependant, qu'il s'agit d'une décision totalement arbitraire, et dans les deux cas la documentation pourrait être écrite avec le autre système d'étiquetage bit, sans aucun effet sur la performance réelle des systèmes. C'est comme le choix, qu'écrire de gauche à droite ou de la droite a gauche (ou du haut vers le bas, pour cette matière): le contenu n'est pas affecté, tant que vous connaissez et comprenez la convention .
bien qu'il existe une certaine corrélation entre l'ordre des octets et l'étiquetage bit, les quatre concepts ci-dessus sont distincts.
il y a une corrélation entre l'ordre des octets et l'étiquetage bit - dans le sens où la documentation pour beaucoup de big-endian le matériel utilise l'étiquetage bit où le bit le plus significatif est bit zéro -, mais c'est seulement en raison des choix faits par les humains.
dans c , l'ordre dans lequel le compilateur C empile les champs de bits dans une structure, varie entre les compilateurs et les architectures. Il n'est pas spécifié par la norme. Pour cette raison, c'est généralement une mauvaise idée de lire des fichiers binaires dans un type struct avec des bitfields. (Même si cela fonctionne sur une machine et un compilateur spécifiques, là n'est pas une garantie qu'il fonctionne sur les autres; souvent, il ne le fait pas. Donc, ça rend le code moins portable.) Au lieu de cela, lire dans un tampon, et un tableau de unsigned char
, et utiliser l'Assistant accessor fonctions pour extraire les champs de bits à partir du tableau en utilisant des déplacements de bits ( <<
, >>
), ors binaire ( |
), et masquage (binaire et, &
).
l'ennui d'un octet en termes d'ordre de bits n'est pas vraiment un problème sauf si vous travaillez avec un système exotique qui vous permet d'adresser les bits séparément. Il peut s'agir d'un problème au moment de décider comment transmettre des données par fil, mais cette décision est habituellement prise au niveau du matériel.
Audio
En termes de pertinence pour streaming audio , il pourrait très bien être important. Le le matériel qui convertit le flux audio numérique en signaux audio analogiques peut s'attendre à ce que les bits du flux soient dans un ordre particulier. S'ils se trompent, le son pourrait être complètement coupé. Peut-être l'auteur de votre livre donne des précisions sur ce point? Quoi qu'il en soit, comme je l'ai mentionné plus tôt, cela est normalement décidé au niveau du matériel et n'est pas vraiment un problème lors de la programmation au niveau d'un utilisateur ou même d'un noyau. En général, les normes de l'industrie définiront comment deux le matériel transmettra les données les uns aux autres. Tant que tout votre matériel est d'accord sur le peu endianness, alors tout va bien.
L'ordre des bits à l'intérieur d'un octet n'a pas de sens, les bits à l'intérieur d'un octet ne sont pas adressables de sorte que vous ne pouvez pas définir un ordre de ces bits pour l'utiliser comme référence pour une définition de l'ennui. Contrairement aux bits, les octets sont adressables, il y a donc un ordre d'adresse que nous pouvons utiliser comme référence pour définir ce que veut dire petit ou grand endian.
vous pouvez avoir l'impression que les opérateurs bit-wise Left shift <<
ou Right Shift >>
impliquent indirectement qu'il y a une afin de bits à l'intérieur d'un octet, mais ce n'est pas vrai. Ces deux termes sont basés sur une représentation abstraite de byte où le bit le plus bas est situé à droite et les bits obtiennent une valeur plus élevée en allant à gauche, mais par définition Left shift
a le même effet que la multiplication par 2, et Right shift
a le même effet que la division par 2 (pour les entiers non signés).