Um byte contém 8 bits ou 9?

56

Li neste tutorial de programação de montagem que 8 bits são usados ​​para dados, enquanto 1 bit é para paridade, que é usada para detectar erros de paridade (causados ​​por falha de hardware ou distúrbio elétrico).

Isso é verdade?

xtt
fonte
5
Consulte cs.stackexchange.com/a/19851/584 para obter uma discussão sobre o que um byte pode ser.
AProgrammer
63
Esse artigo está cheio de bobagens e você deve ignorá-lo.
David Schwartz
12
Se você quer ser pedante, basta chamá-los de "octetos". Esse artigo foi escrito com um processador muito específico em mente (um que deve manter os bits de paridade na ROM por algum motivo ...) ou é apenas uma loucura. Os PICs de microchip, por exemplo, usam um comprimento de palavra de 14 bits. Toda a memória do programa é organizada em uma matriz N x 14 bits.
Nick T
13
@ NickT: eles não são a mesma coisa, no entanto. Um octeto é sempre 8 bits, um byte pode ser qualquer coisa.
Jörg W Mittag
4
O artigo pode estar referenciando os mecanismos de correção de memória usados ​​em alguns PCs IBM antigos, mas afirmar que "byte são dados de 8 bits + paridade de 1 bit" é totalmente sem sentido. Como exemplo, os CD-ROMs geralmente usam mecanismos de correção de erros muito mais ambiciosos - um CD de áudio típico usa 8 bytes por 24 bytes de dados de áudio. Mas a parte mais importante é que você não se importa . Em absoluto. É exclusivo para o mecanismo de armazenamento de memória real - a CPU não se importa, seu código não se importa.
Luaan

Respostas:

78

Um byte de dados tem oito bits, pode haver mais bits por byte de dados usados ​​no sistema operacional ou até no nível do hardware para verificação de erros (bit de paridade ou mesmo um esquema de detecção de erros mais avançado), mas os dados são oito bits e qualquer bit de paridade é geralmente invisível para o software. Um byte foi padronizado para significar 'oito bits de dados'. O texto não está errado ao dizer que pode haver mais bits dedicados ao armazenamento de um byte de dados do que os oito bits de dados, mas esses normalmente não são considerados parte do byte em si, o próprio texto aponta para esse fato.

Você pode ver isso na seção a seguir do tutorial:

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

4 * 8 = 32, pode levar até 36 bits no sistema, mas, para seus propósitos e propósitos, são apenas 32 bits.

JustAnotherSoul
fonte
5
Bem, se o hardware implementa a detecção de erros, provavelmente o faria com blocos de memória maiores que um byte, como setores de 512 bytes ou mais ... dessa maneira, você pode reduzir a sobrecarga de memória extra necessária. Apenas para esclarecer: mesmo com a correção de erros, o hardware ainda usa 8 bits por byte mais alguns bits para cada "pedaço" de dados, o que provavelmente é muito maior que um único byte.
Bakuriu
11
Observe que existem sistemas com bytes não de 8 bits visíveis por software. Consulte Quais plataformas têm algo diferente de char de 8 bits? pergunta no StackOverflow.
Ruslan
3
Sim, eles realmente existem. Embora esse link em particular esteja falando de caracteres não de 8 bits. Por assim dizer: byte costumava se referir ao número de bits que um determinado sistema levou para armazenar um 'char', que era tão baixo quanto seis bits. Mas o IIRC é padronizado na especificação IEC-80000 de que um byte tem 8 bits. À medida que você se afasta dos sistemas tradicionais, você encontra estranhezas, é claro, e os padrões não são leis.
JustAnotherSoul
3
@JustAnotherSoul: E existem padrões concorrentes, que definem byte como "pelo menos 8 bits" ou de outras maneiras. É interessante ver como décadas depois a definição de byte muda na mente das pessoas. No tempo de muito mais heterogeneidade de arquitetura, o byte era simplesmente a menor unidade endereçável da sua arquitetura (veja vários PDPs para exemplos). Essa também é a razão pela qual, no advento da Internet, o termo octeto foi usado para descrever os dados na conexão, pois byte não era uma palavra universal para um pedaço de dados de 8 bits.
PlasmaHH
2
@JustAnotherSoul observe que charem C (que é o objetivo do link) é exatamente a menor unidade de memória endereçável. É apenas chamado de char , mas o C Standard torna sinônimo de byte .
Ruslan
48

Tradicionalmente, um byte pode ter qualquer tamanho e é apenas a menor unidade de memória endereçável. Atualmente, os bytes de 8 bits foram praticamente padronizados para o software. Como JustAnotherSoul disse, o hardware pode armazenar mais bits do que os 8 bits de dados.

Se você estiver trabalhando em dispositivos lógicos programáveis, como FPGAs, poderá ver que a memória interna é frequentemente endereçável como blocos de 9 bits e, como autor do HDL, você pode usar esse 9º bit para verificação de erros ou apenas para armazenar quantidades maiores de dados por "byte". Ao comprar chips de memória para hardware personalizado, geralmente você tem a opção de unidades endereçáveis ​​de 8 ou 9 bits (ou 16/18, 32/36, etc), e cabe a você decidir se possui "bytes" de 9 bits e quais você faz com esse nono bit, se optar por tê-lo.

Extrarius
fonte
10
Geralmente, quando há um grupo de dados que é logicamente uma única unidade, mas contém mais / menos de 8 bits, isso é chamado de "palavra". Por exemplo, alguns processadores usam uma palavra de instrução de 40 bits.
Devsman
3
+1. Aliás, houve arquiteturas com "ponteiros de bits" e "ponteiros de bytes". Nessas arquiteturas, um byte tecnicamente não é "a menor unidade de memória endereçável" (já que você pode endereçar cada bit independentemente), embora seja difícil dizer sucintamente o que é . Eu acho que é um tipo de coisa "eu sei quando vejo". :-P
ruakh
18
"Octeto" era a palavra tradicionalmente usada para significar "eu diria que é um byte, mas realmente quero dizer exatamente 8 bits" para vários protocolos de comunicação entre sistemas que podem ter tamanhos de bytes diferentes. Mas hoje em dia, usar byte para significar algo além de 8 bits é anacrônico.
wnoise
@ Devsman Não necessariamente. Os chips x86 possuem palavras de 32 bits e bytes de 8 bits, por exemplo. Um byte é o menor tamanho endereçável. A palavra é um pouco mais vagamente definida, mas tende a ser do tamanho mais conveniente para se trabalhar; isto é, o comprimento esperado do operando da maioria das instruções.
Raio
Isso deve ser marcado como a resposta correta, é mais correto.
awiebe
32

Esse texto é extremamente mal formulado. Ele está quase certamente falando sobre RAM ECC (código de correção de erros) .

A ram ECC normalmente armazena informações em 8 bits usando 9 bits. O bit por byte extra é usado para armazenar códigos de correção de erros.

ECC vs não-ECC (Nos dois casos, todos os bytes são distribuídos por todos os chips. Imagem cortesia de Puget Systems )

Tudo isso é totalmente invisível para os usuários do hardware. Nos dois casos, o software que usa essa RAM vê 8 bits por byte.


Como um aparte: os códigos de correção de erros na RAM normalmente não são na verdade 1 bit por byte; eles são 8 bits por 8 bytes. Isso tem a mesma sobrecarga de espaço, mas tem algumas vantagens adicionais. Veja SECDED para mais informações.

BlueRaja - Danny Pflughoeft
fonte
12
RAM de paridade e RAM de ECC são coisas diferentes. A RAM de paridade armazena um bit adicional por domínio de erro, pode detectar todos os erros de um bit e sem erros de dois bits e não pode corrigir nada. O ECC armazena vários bits adicionais por domínio de erro, pode detectar e corrigir todos os erros de um único bit, pode detectar, mas não pode corrigir, todos os erros de dois bits e pode detectar alguns erros maiores. A RAM de paridade é rara atualmente, tendo sido quase totalmente substituída pela RAM do ECC.
Mark
11
@ Mark: Eu insinuei isso no meu último parágrafo, há mais detalhes no link. Atualmente, a RAM de paridade é inexistente atualmente porque um código de correção de erros (72,64) possui a mesma sobrecarga que um código de paridade (9,8).
BlueRaja - Danny Pflughoeft
7
Enquanto você sugere, também declara coisas que a tornam imprecisa / confusa. A RAM do ECC não "armazena informações de 8 bits usando 9 bits". Afirmando que isso implica que você pode fazer ECC por 8 bits usando 9 bits, o que não é possível. Para 8 bits de informação discreta, 1 bit extra é suficiente para detectar , não corrigir, erros de bit único. Os ECCs usam um número maior de bits ou bytes para conter dados suficientes para corrigir erros em grupos de dados, geralmente maiores que um único byte. Embora isso possa média de um bit extra por 8 bits, não pode ser dividido em associar apenas 1 bit a cada 8 bits.
Makyen
Existe um esquema de 36 bits (palavra de 32 bits + ECC de 4 bits) que permite a correção de erros de um bit e a detecção de erros de dois bits. Embora você possa aritmeticamente dividi-lo em 8 bits de dados + 1 bit ECC, ele não pode / não funciona dessa maneira. São necessários 4 bits completos de ECC, que cobrem 32 bits de dados.
Zenilogix
@Zenilogix e outros que repetiram a mesma coisa: eu entendo muito bem como o ECC funciona e nada do que eu disse estava incorreto. Eu nunca afirmei que o ECC de 8 bits pode ser feito com 9 bits, eu disse que a RAM do ECC usa 9 bits por byte de armazenamento. Como o ECC funciona está completamente fora de escopo para esta questão, e é por isso que deixei os detalhes como um lado com um link. Por favor, pare todos os comentários pedantes.
BlueRaja - Danny Pflughoeft
16

De um modo geral, a resposta curta é que um byte é de 8 bits. Isso simplifica demais o assunto (às vezes até o ponto da imprecisão), mas é a definição com a qual a maioria das pessoas (incluindo um grande número de programadores) está familiarizada, e a definição que quase todo mundo usa como padrão (independentemente de quantos bytes de tamanho diferente eles " tive que trabalhar).

Mais especificamente, um byte é a menor unidade de memória endereçável para a arquitetura fornecida e geralmente é grande o suficiente para conter um único caractere de texto. Na maioria das arquiteturas modernas, um byte é definido como 8 bits; A ISO / IEC 80000-13 também especifica que um byte é de 8 bits, assim como o consenso popular (o que significa que se você estiver falando, digamos, de bytes de 9 bits, terá muitos problemas, a menos que explicitamente (você não quer dizer bytes normais).

No entanto, existem excepções a esta regra. Por exemplo:

Portanto, na maioria dos casos, um byte geralmente terá 8 bits. Caso contrário, provavelmente é de 9 bits e pode ou não fazer parte de uma palavra de 36 bits.

Justin Time 2 Restabelecer Monica
fonte
8

Observe que o termo byte não está bem definido sem contexto. No que diz respeito às arquiteturas de computadores, você pode assumir que um byte é de 8 bits, pelo menos para arquiteturas modernas. Isso foi amplamente padronizado por linguagens de programação como C, que exigia que os bytes tivessem pelo menos 8 bits, mas não fornecia nenhuma garantia para bytes maiores, tornando 8 bits por byte a única suposição segura.

Existem computadores com unidades endereçáveis ​​maiores que 8 bits (geralmente 16 ou 32), mas essas unidades são geralmente chamadas de palavras de máquina, não bytes. Por exemplo, um DSP com palavras de 32K e 32 bits de RAM seria anunciado como tendo 128 KB ou RAM, e não 32 KB.

As coisas não são tão bem definidas quando se trata de padrões de comunicação. O ASCII ainda é amplamente utilizado e possui bytes de 7 bits (que se encaixam perfeitamente em bytes de 8 bits nos computadores). Os transceptores UART ainda são produzidos para ter um tamanho de byte configurável (geralmente, você escolhe entre pelo menos 6, 7 e 8 bits por byte, mas 5 e 9 não são inéditos).

Dmitry Grigoryev
fonte
6

Um byte é geralmente definido como a menor unidade de espaço de memória endereçável individualmente. Pode ser de qualquer tamanho. Existem arquiteturas com tamanhos de bytes entre 6 e 9 bits, talvez até maiores. Também existem arquiteturas em que a única unidade endereçável é o tamanho do barramento; em tais arquiteturas, podemos dizer que elas simplesmente não têm byte ou o byte é do mesmo tamanho da palavra (em um caso em particular, eu sei ser de 32 bits); de qualquer forma, definitivamente não é de 8 bits. Da mesma forma, existem arquiteturas endereçáveis ​​por bits; nessas arquiteturas, poderíamos argumentar novamente que os bytes simplesmente não existem, ou poderíamos argumentar que os bytes têm 1 bit; de qualquer maneira é uma definição sensata, mas 8 bits está definitivamente errado.

Em muitas arquiteturas de uso geral, um byte contém 8 bits. No entanto, isso não é garantido. Quanto mais você se afastar do mainstream e / ou das CPUs de uso geral, maior será a probabilidade de encontrar bytes não de 8 bits. Isso vai tão longe que alguns softwares altamente portáteis tornam o tamanho configurável. Por exemplo, versões mais antigas do GCC continham uma macro chamada BITS_PER_BYTE(ou algo parecido), que configurava o tamanho de um byte para uma arquitetura específica. Acredito que algumas versões mais antigas do NetBSD possam ser executadas em arquiteturas que não sejam de 8 bits por byte.

Se você realmente deseja enfatizar que está falando de uma quantidade exata de 8 bits, e não da menor quantidade endereçável de memória, por maior que seja, você pode usar o termo octeto , que é, por exemplo, usado em muitas RfCs mais recentes.

Jörg W Mittag
fonte
2
C padrão e C ++ têm uma macro predefinida CHAR_BIT(encontrada em limits.h), eu não estou ciente deBITS_PER_BYTE
njuffa
3

Quando eu comecei a programar em 1960, tínhamos palavras de 48 bits com bytes de 6 bits - elas não eram chamadas assim, eram chamadas de caracteres. Depois trabalhei no computador Golem com palavras de 75 bits e bytes de 15 bits. Mais tarde, os bytes de 6 bits eram a norma, até a IBM lançar o 360, e atualmente um byte é geralmente equivalente a um octeto, ou seja, 8 bits de dados. Alguns hardwares tinham bits adicionais para detecção de erros e possivelmente correção de erros, mas estes não eram acessíveis pelo software.

Jonathan Rosenne
fonte
3

Um byte é de 8 bits.

No passado distante, havia definições diferentes de uma palavra de memória e de um byte. A sugestão de que essa ambiguidade seja generalizada ou seja predominante na vida de hoje é falsa.

Desde pelo menos o final dos anos 70, um byte tem 8 bits. A população em massa de computadores domésticos e PCs utilizou inequivocamente um byte como valor de 8 bits em sua documentação, assim como todas as folhas de dados e documentação de unidades de disquete, unidades de disco rígido e PROM / EPROM / EEPROM / Flash EPROM Chips de memória / SRAM / SDRAM que li nesse período. (E eu pessoalmente li muitos deles durante esse período.) A Ethernet e alguns outros protocolos de comunicação se destacam para mim como incomuns ao falar sobre octetos.

A ambiguidade do termo byte é em si uma coisa rara e obscura. Pouquíssimos da população de programadores, engenheiros de projeto, engenheiros de teste, vendedores, engenheiros de serviço ou apostadores médios nos últimos 30 anos ou mais pensariam que isso significaria algo diferente de um valor de 8 bits, se reconhecessem a palavra. .

Quando um byte é tratado pelo hardware, como quando armazenado em chips de memória ou comunicado ao longo do fio, o hardware pode adicionar dados redundantes ao byte. Isso pode ajudar posteriormente na detecção de erros de hardware, para que dados não confiáveis ​​possam ser reconhecidos e descartados (por exemplo, paridade, soma de verificação, CRC). Ou pode permitir que erros nos dados sejam corrigidos e recuperados (por exemplo, ECC). De qualquer forma, os dados redundantes serão descartados quando o byte for recuperado ou recebido para processamento adicional. O byte permanece o valor central de 8 bits e os dados redundantes permanecem dados redundantes.

TonyM
fonte
2

Primeiro, o tutorial que você está referenciando parece bastante desatualizado e parece direcionado para versões desatualizadas de processadores x86, sem declará-lo, portanto muitas das coisas que você lê lá não serão entendidas por outros (por exemplo, se você alegar que uma PALAVRA é de 2 bytes, as pessoas não saberão do que você está falando ou saberão que você foi ensinado com base em processadores x86 muito desatualizados e saberão o que esperar).

Um byte é o número de bits que alguém decide que deve ser. Poderia ser 8 bits, 9 bits ou 16 bits, qualquer coisa. Em 2016, na maioria dos casos, um byte terá oito bits. Para estar seguro, você pode usar o termo octeto - um octeto é sempre, sempre, oito bits.

A verdadeira confusão aqui está confundindo duas perguntas: 1. Qual é o número de bits em um byte? 2. Se eu quisesse transferir um byte de um lugar para outro, ou se quisesse armazená-lo, usando meios físicos práticos, como faria isso? A segunda pergunta geralmente é de pouco interesse para você, a menos que você trabalhe em uma empresa que fabrica modems, discos rígidos ou unidades SSD. Na prática, você está interessado na primeira pergunta e, na segunda, apenas diz "bem, alguém cuida disso".

O bit de paridade mencionado é um mecanismo primitivo que ajuda a detectar que quando um byte é armazenado na memória e, posteriormente, o byte é lido, a memória foi alterada por algum acidente. Não é muito bom nisso, porque não descobrirá que dois bits foram alterados; portanto, uma mudança provavelmente não será detectada e não poderá se recuperar do problema porque não há como descobrir quais dos 8 bits foram alterados. , ou mesmo se o bit de paridade foi alterado.

Os bits de paridade praticamente não são usados ​​nessa forma primitiva. Os dados armazenados permanentemente são geralmente protegidos de maneiras mais complicadas, por exemplo, adicionando uma soma de verificação de 32 bits ou mais a um bloco de 1024 bytes - que ocupa muito menos espaço extra (0,4% neste exemplo, em vez de 12,5%) e é muito mais menos propenso a não descobrir quando algo está errado.

gnasher729
fonte
Realmente desatualizado: o "parágrafo" de 16 bytes não é uma unidade significativa de memória desde a mudança do modo real e do endereçamento segmentado.
Mark
Pessoalmente, eu assumiria "WinAPI" quando alguém fala sobre 2 bytes WORD, o que ... meio que prova o seu ponto, já que muitos nomes de tipo WinAPI estão desatualizados, mas mantidos para compatibilidade com versões anteriores. xP
Justin Time 2 Restabelecer Monica
1

Apesar das respostas realmente excelentes fornecidas aqui, estou surpreso que ninguém apontou que os bits de paridade ou bits de correção de erros são por definição 'metadados' e, portanto, não fazem parte do próprio byte.

Um byte tem 8 bits !

user34445
fonte
0

No uso moderno, um byte é de 8 bits, ponto final (embora historicamente tenha outras definições). Por outro lado, uma palavra de dados é o que o hardware em questão manipula como uma unidade atômica - pode ser 8 bits, 9 bits, 10 bits, 12 bits, 16 bits, 20 bits, 24 bits, 32 bits, etc. Vários computadores sistemas ao longo dos anos tiveram todos os tipos de tamanhos de palavras diferentes.

Para implementar um sistema de memória ou um protocolo de transmissão, é benéfico adicionar detecção / correção de erros que envolvam bits adicionais. Eles não produzem um byte de 9 bits porque, como afirmado acima, um byte é de 8 bits.

Vários esquemas adicionam detecção e / ou correção de erros de várias maneiras.

O uso típico da paridade é adicionar um bit extra à palavra de transmissão para que o receptor possa detectar um único bit de erro.

Um esquema que pode fornecer correção de erro de bit único envolve a adição de 4 bits de ECC por palavra de dados de 32 bits. Isso só é aritmeticamente equivalente a 1 bit por byte, mas não pode / não funciona dessa maneira. Uma palavra de dados de 36 bits pode transportar informações suficientes para se recuperar de um erro de bit único para um espaço de dados de 32 bits.

Zenilogix
fonte
0

8 bits. Dentro do processador e do teclado, são 9 e 11 bits. Os dados do usuário são representados em 8 bits. As teclas do teclado enviam cantos que são divididos em 11 bits. 1 bit inicial, 1 final, 1 paridade e 8 bits representando uma tecla pressionada.

Siva
fonte
2
Isso responde a pergunta? Você quer dizer comprimentos diferentes para bytes em cpu e bytes em teclado? Os "cantos" devem ser "cordas" ou "fluxos"?
Apass.Jack
Parece que você está falando de um protocolo de conexão, incluindo dados de enquadramento, não os dados reais.
Peter Cordes
Eu diria que "canta" é "sinais", eu mesmo, @ Apass.Jack.
Justin Time 2 Restabelecer Monica