Un octet contient-il 8 bits ou 9?

56

J'ai lu dans ce tutoriel de programmation d'assemblage que 8 bits sont utilisés pour les données et 1 bit pour la parité, qui est ensuite utilisée pour détecter une erreur de parité (provoquée par un défaut matériel ou une perturbation électrique).

Est-ce vrai?

xtt
la source
5
Voir cs.stackexchange.com/a/19851/584 pour une discussion sur ce que peut être un octet .
AProgrammer
63
Cet article est rempli de bêtises et vous devriez l'ignorer.
David Schwartz
12
Si vous voulez être pédant, appelez-les simplement "octets". Cet article est écrit avec un processeur très spécifique (un processeur qui doit conserver des bits de parité dans la ROM pour une raison quelconque ...) ou est simplement wack. Les PIC de la puce, par exemple, utilisent une longueur de mot de 14 bits. La totalité de la mémoire du programme est organisée dans un tableau de N x 14 bits.
Nick T
13
@ NickT: ce n'est pas la même chose, cependant. Un octet est toujours 8 bits, un octet peut être n'importe quoi.
Jörg W Mittag
4
L’article faisait peut-être référence aux mécanismes de correction de la mémoire utilisés dans certains anciens PC IBM, mais il était insensé de dire que «octet est une donnée de 8 bits + une parité de 1 bit». Par exemple, les CD-ROM utilisent généralement des mécanismes de correction d'erreur beaucoup plus gourmands: un CD audio typique utilise 8 octets par 24 octets de données audio. Mais le plus important est que vous ne vous en souciez pas . Du tout. C'est exclusif au mécanisme de stockage en mémoire - le processeur s'en fiche, votre code ne s'en soucie pas.
Luaan

Réponses:

78

Un octet de données est huit bits. Il peut y avoir plus de bits par octet de données utilisés au niveau du système d'exploitation ou même du matériel pour la vérification des erreurs (bit de parité ou même un schéma de détection d'erreur plus avancé), mais les données sont au nombre de huit. Les bits et les bits de parité sont généralement invisibles pour le logiciel. Un octet a été normalisé pour signifier «huit bits de données». Le texte n’a pas tort de dire qu’il peut y avoir plus de bits dédiés au stockage d’un octet de données que de huit bits de données, mais que ceux-ci ne sont généralement pas considérés comme faisant partie de l’octet en tant que tel, le texte lui-même l'indique.

Vous pouvez le voir dans la section suivante du tutoriel:

Doubleword: a 4-byte (32 bit) data item

4 * 8 = 32, cela peut prendre 36 bits sur le système, mais pour l’intention, ce n’est que 32 bits.

JustAnotherSoul
la source
5
Eh bien, si le matériel implémentait la détection d'erreur, il le ferait probablement avec de plus gros morceaux de mémoire qu'un octet, comme avec les secteurs de 512 octets ou plus ... de cette façon, vous pouvez réduire la surcharge de mémoire supplémentaire nécessaire. Juste pour clarifier: même avec la correction d'erreur, le matériel utilise toujours 8 bits par octet plus quelques bits pour chaque "bloc" de données, ce qui est probablement beaucoup plus grand qu'un octet.
Bakuriu
11
Notez qu'il existe des systèmes avec des octets non-8 bits visibles par logiciel. Voir Quelles plates-formes ont autre chose qu'un caractère 8 bits? question à StackOverflow.
Ruslan
3
Oui, ils existent vraiment. Bien que ce lien particulier parle de caractères non-8 bits. En fait, octet désignait simplement le nombre de bits qu'un système donné a pris pour stocker un «caractère», qui ne contenait que six bits. Mais le IIRC est normalisé dans la spécification CEI-80000 qu'un octet est de 8 bits. En vous éloignant des systèmes traditionnels, vous trouvez bien sûr des bizarreries et les normes ne sont pas des lois.
JustAnotherSoul
3
@JustAnotherSoul: Et il existe des normes concurrentes, qui définissent l'octet comme "au moins 8 bits" ou d'une autre manière. Il est intéressant de voir comment des décennies plus tard la définition des octets change dans l’esprit des gens. À l’époque de l’hétérogénéité architecturale, l’octet était tout simplement la plus petite unité adressable de votre architecture (regardez les différents PDP pour des exemples). C’est aussi la raison pour laquelle, à l’avènement de l’Internet, le terme octet a été utilisé pour décrire les données sur fil, car octet n’était pas un mot universel pour désigner un bloc de données à 8 bits.
PlasmaHH
2
@JustAnotherSoul notez que chardans C (qui est le lien), c'est exactement la plus petite unité de mémoire adressable. Cela s'appelle simplement char , mais le standard C le rend synonyme d' octet .
Ruslan
48

Traditionnellement, un octet peut avoir n'importe quelle taille et n'est que la plus petite unité de mémoire adressable. Ces jours-ci, les octets 8 bits ont été à peu près normalisés pour les logiciels. Comme JustAnotherSoul l’a dit, le matériel peut stocker plus de bits que les 8 bits de données.

Si vous travaillez sur des dispositifs à logique programmable, tels que les FPGA, vous constaterez peut-être que leur mémoire interne est souvent adressable sous forme de fragments de 9 bits. En tant qu'auteur du HDL, vous pouvez utiliser ce 9ème bit pour la vérification des erreurs ou simplement pour stocker des quantités plus importantes. de données par "octet". Lorsque vous achetez des puces de mémoire pour du matériel personnalisé, vous avez généralement le choix entre des unités adressables de 8 ou 9 bits (ou 16/18, 32/36, etc.), puis vous pouvez choisir si vous avez ou non des "octets" de 9 bits. vous faites avec ce 9ème bit si vous choisissez de l'avoir.

Extrarius
la source
10
Généralement, quand il y a un groupe de données qui est logiquement une seule unité mais qui contient plus / moins de 8 bits, cela s'appelle un "mot". Par exemple, certains processeurs utilisent un mot d'instruction de 40 bits.
Devsman
3
+1 Incidemment, il y a eu des architectures avec à la fois des "pointeurs de bits" et des "pointeurs d'octets". Dans de telles architectures, un octet n'est techniquement pas "la plus petite unité de mémoire adressable" (car vous pouvez adresser chaque bit indépendamment), bien qu'il soit difficile de dire de manière succincte de quoi il s'agit . Je suppose que c'est un genre de chose "je le sais quand je le vois". :-P
ruakh
18
"Octet" était le mot traditionnellement utilisé pour signifier "je l'appellerais un octet, mais je veux vraiment dire exactement 8 bits" pour différents protocoles de communication entre systèmes pouvant avoir différentes tailles en octets. Mais ces jours-ci, utiliser byte pour signifier autre chose que 8 bits est anachronique.
wnoise
@ Devsman Pas nécessairement. Les puces x86 ont des mots de 32 bits et des octets de 8 bits, par exemple. Un octet est la plus petite taille adressable. Le mot est défini de manière un peu plus vague, mais tend à être la taille avec laquelle il est le plus pratique de travailler; c'est-à-dire la longueur d'opérande attendue de la plupart des instructions.
Ray
Cela devrait être marqué comme la bonne réponse, c'est plus correct.
awiebe
32

Ce texte est extrêmement mal rédigé. Il parle presque certainement de la mémoire RAM ECC (code de correction d'erreur) .

La RAM ECC stockera généralement une valeur de 8 bits d’informations en utilisant 9 bits. Le nombre supplémentaire de bits par octet est utilisé pour stocker les codes de correction d'erreur.

ECC vs non-ECC (Dans les deux cas, chaque octet est réparti sur chaque puce. Image reproduite avec l'aimable autorisation de Puget Systems )

Tout cela est complètement invisible pour les utilisateurs du matériel. Dans les deux cas, le logiciel utilisant cette RAM voit 8 bits par octet.


En passant: les codes de correction d'erreur dans la RAM ne sont généralement pas de 1 bit par octet; au lieu de cela, ils sont 8 bits par 8 octets. Cela a le même espace, mais présente quelques avantages supplémentaires. Voir SECDED pour plus d'informations.

BlueRaja - Danny Pflughoeft
la source
12
La RAM de parité et la RAM ECC sont des choses différentes. La RAM de parité stocke un bit supplémentaire par domaine d'erreur, peut détecter toutes les erreurs sur un bit et aucune erreur sur deux bits, et ne peut rien corriger. ECC stocke un nombre de bits supplémentaires par domaine d'erreur, peut détecter et corriger toutes les erreurs sur un seul bit, peut détecter mais ne corrige pas toutes les erreurs sur deux bits et peut intercepter des erreurs plus importantes. La RAM de parité est rare de nos jours, ayant été presque entièrement remplacée par la RAM ECC.
Marc
1
@ Mark: J'y ai fait allusion dans mon dernier paragraphe, il y a plus de détails dans le lien. La mémoire RAM de parité est pratiquement inexistante de nos jours car un code de correction d'erreur (72,64) entraîne le même temps système qu'un code de parité (9,8).
BlueRaja - Danny Pflughoeft
7
Pendant que vous y faites allusion, vous énoncez également des choses qui le rendent imprécis / déroutant. La RAM ECC ne "stocke pas une valeur de 8 bits en utilisant 9 bits". Cela signifie que vous pouvez utiliser ECC pour 8 bits en utilisant 9 bits, ce qui n’est pas possible. Pour 8 bits d'informations discrètes, un bit supplémentaire suffit à détecter , sans corriger, les erreurs sur un seul bit. Les codes ECC utilisent un plus grand nombre de bits, ou d'octets, pour contenir des données suffisantes pour corriger les erreurs pour des groupes de données, généralement supérieurs à un seul octet. Bien que cela puisse faire une moyenne d' un bit supplémentaire par 8 bits, il ne peut pas être divisé en associant seulement 1 bit à chaque 8 bits.
Makyen
Il existe un schéma à 36 bits (mot de 32 bits + ECC à 4 bits) qui permet la correction d'erreur sur un bit et la détection d'erreur sur deux bits. Bien que vous puissiez le diviser de manière arithmétique en 8 bits de données + 1 bit ECC, cela ne peut pas / ne fonctionne pas ainsi. Les 4 bits complets de ECC sont requis, ce qui couvre 32 bits de données.
Zenilogix
@Zenilogix et d'autres qui ont répété la même chose: je comprends très bien le fonctionnement de l'ECC et rien de ce que j'ai dit n'est incorrect. Je n'ai jamais prétendu que l'ECC 8 bits pouvait être fait avec 9 bits, j'ai dit que la RAM ECC utilise 9 bits par octet de stockage. Le fonctionnement de l'ECC est totalement hors de propos pour cette question, c'est pourquoi j'ai laissé les détails en parallèle avec un lien. S'il vous plaît arrêter tous les commentaires pédant.
BlueRaja - Danny Pflughoeft
16

De manière générale, la réponse courte est qu'un octet est de 8 bits. Cela simplifie excessivement le problème (parfois même au point d’être inexact), mais c’est la définition que la plupart des gens (y compris un grand nombre de programmeurs) connaissent bien, et la définition de presque tout le monde par défaut (quel que soit le nombre d’octets de taille différente qu’ils nous avons dû travailler avec).

Plus spécifiquement, un octet est la plus petite unité de mémoire adressable pour une architecture donnée et est généralement suffisamment grand pour contenir un seul caractère de texte. Sur la plupart des architectures modernes, un octet est défini sur 8 bits; ISO / IEC 80000-13 spécifie également qu'un octet est de 8 bits, comme le fait le consensus général (ce qui signifie que si vous parlez d'octets de 9 bits, par exemple, vous rencontrerez beaucoup de problèmes à moins que vous déclarez que vous ne voulez pas dire octets normaux).

Cependant, il existe des exceptions à cette règle. Par exemple:

Ainsi, dans la plupart des cas, un octet sera généralement de 8 bits. Si ce n'est pas le cas, il s'agit probablement de 9 bits et peut ne pas faire partie d'un mot de 36 bits.

Justin Time 2 Rétablir Monica
la source
8

Notez que le terme octet n'est pas bien défini sans contexte. En ce qui concerne les architectures informatiques, vous pouvez supposer qu'un octet est de 8 bits, du moins pour les architectures modernes. Cela était largement normalisé par les langages de programmation tels que C, qui exigeait que les octets aient au moins 8 bits mais ne fournissaient aucune garantie pour des octets plus grands, faisant de 8 bits par octet la seule hypothèse sûre.

Il existe des ordinateurs avec des unités adressables de plus de 8 bits (généralement 16 ou 32), mais ces unités sont généralement appelées mots machine et non pas octets. Par exemple, un DSP avec 32K mots de RAM 32 bits serait annoncé comme ayant 128 Ko ou RAM, pas 32 Ko.

Les choses ne sont pas aussi bien définies en ce qui concerne les normes de communication. L'ASCII est encore largement utilisé et ses octets sont de 7 bits (ce qui convient parfaitement aux octets de 8 bits des ordinateurs). Les émetteurs-récepteurs UART sont toujours produits pour avoir une taille en octets configurable (en général, vous devez choisir entre au moins 6, 7 et 8 bits par octet, mais 5 et 9 ne sont pas inconnus).

Dmitry Grigoryev
la source
6

Un octet est généralement défini comme la plus petite unité d'espace mémoire adressable individuellement. Cela peut être n'importe quelle taille. Il y a eu des architectures avec des tailles d'octets comprises entre 6 et 9 bits, peut-être même plus grandes. Il existe également des architectures où la seule unité adressable est la taille du bus. Sur ces architectures, on peut dire qu'elles n'ont tout simplement pas d'octet , ou l'octet est la même taille que le mot (dans un cas particulier que je connaisse qui être 32 bits); de toute façon, ce n'est certainement pas 8 bits. De même, il existe des architectures à adressage binaire, sur ces architectures, nous pourrions encore affirmer que les octets n'existent tout simplement pas, ou nous pourrions dire que les octets ont une valeur de 1 bit; de toute façon est une définition raisonnable, mais 8 bits est définitivement faux.

Sur de nombreuses architectures à usage général, un octet contient 8 bits. Cependant, ce n'est pas garanti. Plus vous vous écartez des processeurs traditionnels et / ou généraux, plus vous rencontrerez des octets autres que 8 bits. Cela va si loin que certains logiciels hautement portables rendent même la taille configurable. Par exemple, les anciennes versions de GCC contenaient une macro appelée BITS_PER_BYTE(ou quelque chose du genre), qui configurait la taille d'un octet pour une architecture particulière. Je pense que certaines versions plus anciennes de NetBSD pourraient être exécutées sur des architectures autres que 8 bits par octet.

Si vous voulez vraiment souligner que vous parlez d'une quantité exacte de 8 bits plutôt que de la plus petite quantité de mémoire adressable, quelle que soit sa taille, vous pouvez utiliser le terme octet , qui est utilisé par exemple dans de nombreux autres centres de contrôle.

Jörg W Mittag
la source
2
Standard C et C ++ ont une macro prédéfinie CHAR_BIT(trouvée dans limits.h), je ne suis pas au courantBITS_PER_BYTE
njuffa
3

Lorsque j'ai commencé à programmer en 1960, nous avions des mots de 48 bits avec des octets de 6 bits - ils s'appelaient alors pas ce nom, ils s'appelaient des caractères. Ensuite, j'ai travaillé sur l'ordinateur Golem avec des mots de 75 bits et des octets de 15 bits. Plus tard, la norme était de 6 octets jusqu'à ce que IBM en publie 360, et de nos jours, un octet équivaut généralement à un octet, soit 8 bits de données. Certains matériels avaient des bits supplémentaires pour la détection d'erreur et éventuellement pour la correction d'erreur, mais ils n'étaient pas accessibles au logiciel.

Jonathan Rosenne
la source
3

Un octet est 8 bits.

Dans le passé lointain, il y avait différentes définitions d'un mot de mémoire et d'un octet. La suggestion selon laquelle cette ambiguïté est généralisée ou prévalente dans la vie d'aujourd'hui est fausse.

Depuis au moins la fin des années 1970, un octet fait 8 bits. La masse des ordinateurs personnels et des ordinateurs personnels utilise sans équivoque un octet comme valeur 8 bits dans sa documentation, de même que toutes les fiches techniques et la documentation relative aux lecteurs de disquettes, aux lecteurs de disque dur et aux EPROM PROM / EPROM / EEPROM / Flash. / Puces de mémoire SRAM / SDRAM que j'ai lu dans cette période. (Et j'en ai personnellement lu une bonne partie tout au long de cette période.) Ethernet et quelques autres protocoles de communication me paraissent inhabituels quand on parle d'octets.

L'ambiguïté du terme octet est en soi une chose rare et obscure. Très très peu de la population des programmeurs, ingénieurs de conception, ingénieurs de test, vendeurs, ingénieurs de service ou parieurs moyens des 30 dernières années ou plus penseraient que cela signifiait autre chose qu'une valeur de 8 bits, s'ils reconnaissaient ce mot. .

Lorsqu'un octet est géré par le matériel, par exemple lorsqu'il est stocké dans des puces de mémoire ou communiqué par fil, le matériel peut ajouter des données redondantes à l'octet. Cela peut aider par la suite à détecter les erreurs matérielles afin que des données non fiables puissent être reconnues et supprimées (par exemple, parité, somme de contrôle, CRC). Ou cela peut permettre de corriger des erreurs dans les données et de les récupérer (par exemple, ECC). Dans les deux cas, les données redondantes seront supprimées lorsque l'octet aura été récupéré ou reçu pour un traitement ultérieur. L'octet reste la valeur centrale de 8 bits et les données redondantes restent des données redondantes.

TonyM
la source
2

Tout d’abord, le didacticiel auquel vous faites référence semble être relativement obsolète et semble viser les versions obsolètes des processeurs x86, sans le préciser. Ainsi, bon nombre des choses que vous lirez ne seront pas comprises par d’autres (par exemple, si vous affirmez Si un mot est composé de 2 octets, les gens ne sauront pas de quoi vous parlez ou ils sauront que vous avez appris à utiliser des processeurs x86 très obsolètes et savent à quoi s'attendre.

Un octet est le nombre de bits que quelqu'un décide. Cela pourrait être 8 bits, 9 bits ou 16 bits, n'importe quoi. En 2016, dans la plupart des cas, un octet sera de huit bits. Pour être sûr, vous pouvez utiliser le terme octet - un octet est toujours, toujours, huit bits.

La vraie confusion crée ici deux questions confuses: 1. Quel est le nombre de bits dans un octet? 2. Si je voulais transférer un octet d'un endroit à un autre, ou si je voulais stocker un octet en utilisant des moyens physiques pratiques, comment le ferais-je? La deuxième question ne vous intéresse généralement pas, sauf si vous travaillez dans une entreprise qui fabrique des modems, des disques durs ou des disques SSD. En pratique, la première question vous intéresse et pour la seconde, vous dites simplement "bon, on s'en occupe".

Le bit de parité mentionné est un mécanisme primitif qui aide à détecter que lorsqu'un octet est stocké en mémoire, puis que l'octet est lu, la mémoire a été modifiée par accident. Ce n'est pas très bon à cela, car il ne trouvera pas que deux bits ont été modifiés, donc un changement risque de ne pas être détecté, et il ne peut pas résoudre le problème car il est impossible de savoir lequel des 8 bits a changé. , ou même si le bit de parité a changé.

Les bits de parité ne sont pratiquement pas utilisés sous cette forme primitive. Les données stockées de manière permanente sont généralement protégées de manière plus complexe, par exemple en ajoutant une somme de contrôle de 32 bits ou plus à un bloc de 1024 octets - ce qui nécessite beaucoup moins d'espace supplémentaire (0,4% dans cet exemple au lieu de 12,5%) et beaucoup plus complexe. moins susceptibles de ne pas savoir quand quelque chose ne va pas.

gnasher729
la source
Vraiment obsolète: le "paragraphe" de 16 octets n'est plus une unité de mémoire significative depuis le passage du mode réel et de l'adressage segmenté.
Mark
Personnellement, je supposerais "WinAPI" lorsque quelqu'un parle de 2 octets WORD, ce qui ... prouve un peu votre propos, car bon nombre des noms de type WinAPI sont obsolètes mais conservés pour des raisons de compatibilité ascendante. xP
Justin Time 2 Réintègre Monica
1

Malgré les réponses vraiment excellentes données ici, je suis surpris que personne n'ait indiqué que les bits de parité ou les bits de correction d'erreur sont par définition des «métadonnées» et ne font donc pas partie de l'octet lui-même.

Un octet a 8 bits !

utilisateur34445
la source
0

Dans l’usage moderne, un octet est composé de 8 bits, point (bien qu’il ait toujours eu d’autres définitions). Par contre, un mot de données est ce que le matériel en question traite comme une unité atomique - il peut s’agir de 8 bits, 9 bits, 10 bits, 12 bits, 16 bits, 20 bits, 24 bits, 32 bits, etc. Au fil des ans, les systèmes ont eu toutes sortes de tailles de mots différentes.

Pour mettre en œuvre un système de mémoire ou un protocole de transmission, il est avantageux d’ajouter une détection / correction d’erreur qui implique des bits supplémentaires. Ils ne font pas pour un octet de 9 bits parce que, comme indiqué ci-dessus, un octet est de 8 bits.

Divers systèmes ajoutent une détection et / ou une correction d'erreur de différentes manières.

L'utilisation typique de la parité consiste à ajouter un bit supplémentaire au mot de transmission afin que le récepteur puisse détecter un seul bit d'erreur.

Un schéma pouvant fournir une correction d'erreur sur un bit implique l'ajout de 4 bits ECC par mot de données de 32 bits. Il se trouve que cela équivaut à être arithmétiquement équivalent à 1 bit par octet, mais cela ne peut pas / ne fonctionne pas ainsi. Un mot de données de 36 bits peut contenir suffisamment d'informations pour récupérer d'une erreur d'un seul bit pour un espace de données de 32 bits.

Zenilogix
la source
0

8 bits. À l’intérieur du processeur et du clavier, les formats 9 et 11 bits sont utilisés. Les données utilisateur sont cependant représentées sur 8 bits. Les touches sur le clavier envoient chante qui est divisé en 11 bits. 1 bit de départ, 1 bit de fin, 1 bit de parité et 8 bits représentant une touche enfoncée.

Shiva
la source
2
Est-ce que cela répond à la question? Voulez-vous dire différentes longueurs pour les octets dans l'unité centrale et les octets dans le clavier? Est-ce que "chante" soit "des chaînes" ou des "flux"?
Apass.Jack
On dirait que vous parlez d'un protocole filaire incluant des données de cadrage, pas des données réelles.
Peter Cordes
Je suppose que "chante" est "des signaux", moi-même, @ Apass.Jack.
Justin Time 2 Réintégrer Monica