A potência de dois bits por palavra é "conveniente"? Se for, por que é isso?

11

Encontro várias fontes alegando que a potência de dois bits em uma palavra binária (como 8 bits por byte) é uma "coisa boa" ou "conveniente". Não encontro nenhuma fonte que indique o porquê.

De Qual é a história de por que os bytes têm oito bits? lemos na resposta aprovada:

Os computadores binários motivam os designers a criar tamanhos de dois.

OK mas porquê? Na mesma pergunta, mas no campo de comentário da pergunta, encontro:

A última frase está de brincadeira? Um byte de 12 bits seria inconveniente porque não é uma potência de 2. - robjb

Mais uma vez, vazio de lógica ...

cálculos de endereço são muito mais simples com potências de 2, e isso conta quando você está criando lógica de transistores brutos em latinhas - Mike

Como os bytes são a menor unidade endereçável, isso não faz muito sentido. Muitos votos positivos no comentário. Talvez eu tenha perdido alguma coisa.

Da Wikipedia :

O padrão de fato de oito bits é uma potência conveniente de dois, permitindo os valores de 0 a 255 para um byte

E isso seria conveniente porque ...?

Para esclarecimento, trata-se do número de bits por byte (por exemplo, 8 ou 6, etc), não o número de valores por byte (por exemplo, 2 8 ou 2 6 , etc). Por causa da confusão, também aponto que não se trata de tamanhos de palavras.

Não estou muito interessado em razões históricas. Essas foram bem explicadas em outros lugares (ver links).


Pergunta relacionada no SO: /programming/1606827/why-is-number-of-bits-always-a-power-of-two

Andreas
fonte
2
@gnat Tenho certeza de que estamos falando do número de bits por byte (ou seja, 8 em um byte de 8 bits) aqui, não o número de valores que um byte pode representar (ou seja, 2 ^ 8 em um byte de 8 bits). Portanto, se você tem, por exemplo, um byte de 6 bits, 6 não é uma potência de dois , mas sim, um byte de 6 bits pode representar uma potência de dois números de valores.
precisa saber é o seguinte
2
@ 8bittree Eu acho que entendi, obrigado por explicar! (voto duplicado retraído - embora eu ache que seria mais fácil para os leitores se uma explicação como em seu último comentário fosse editada na pergunta, isso parece bastante sutil) #
11007
2
Pergunta semelhante no SO: stackoverflow.com/q/1606827/3723423 - a resposta traz alguns argumentos plausíveis sobre a conveniência
Christophe
2
@Snowman: O post do OP contém uma falácia "que implora a pergunta": "Por que os poderes de dois são considerados tamanhos de bytes convenientes?" Eles não são. Não tem nada a ver com poderes de dois; ele interpretou mal a frase no artigo da Wikipedia.
Robert Harvey
3
@RobertHarvey Na resposta a "Qual é o histórico de por que os bytes são oito bits?" (também vinculado na minha pergunta), há a seguinte frase: "Computadores binários motivam os designers a criar tamanhos de potência de dois". Eu também interpretei isso errado? O que ambas as fontes significam na sua opinião? Apenas dizer "você entendeu errado" não está realmente fazendo isso por mim.
Andreas

Respostas:

10

Eu não acho que os bytes de 8 bits tenham sido bem-sucedidos porque têm uma largura que é uma potência de dois. Se você não deseja endereçar os bits individualmente - e isso é um recurso comum, nem agora nem no passado -, ter um poder de dois não tem importância prática real (é apenas - agora, muito mais do que no passado, quando poupado alguns componentes discretos eram importantes - um reflexo para os engenheiros de hardware e software e permanecer em terreno familiar é importante para outros fins), e não me lembro de ter sido mencionado na minha história de leituras de computação (1). Era necessário letras minúsculas, o que significava algo mais do que os conjuntos de caracteres de 6 bits então dominantes. O ASCII era de 7 bits, mas o ASCII era puramente como para a troca (e, portanto, era traduzido para código interno para manipulação) e, portanto,

O Subcommmitee reconhece que é improvável que o fabricante do computador projete computadores que usem códigos de 7 bits internamente. É mais provável que eles usem códigos de 4, 6 e 8 bits. Atualmente, não há uma necessidade generalizada de intercâmbio de mais de 128 caracteres separados e distintos entre computadores e entre computadores e equipamentos de entrada / saída associados. [fita de papel, que tinha um tamanho de quadro natural de 8 bits, mas precisava de paridade, portanto a carga útil de um quadro era de 7 bits também é citada em favor de caracteres de 7 bits para ASCII, a potência de dois não é citada entre as vantagens de 8 bits ] (2)

e para o hardware, o byte de 8 bits ganhou porque permitiu empacotar 2 dígitos decimais em um byte por vez quando 75% dos dados eram numéricos e representados no BCD (3).

(1) por exemplo, Blaauw e Brooks, Computer Architecture ; MacKenzie, Conjuntos de caracteres codificados, História e desenvolvimento têm uma discussão sobre esse assunto.

(3) Documento de X3.2 - o Subcomitê responsável da ASCII - citado por MacKenzie.

(3) MacKenzie, novamente.

AProgrammer
fonte
1
Obrigado. Sua resposta é imediata e você trouxe referências. Você tem o meu voto. Sei que, se o que você diz é verdade, também é impossível provar. Não pode provar a inexistência de algo. Eu acho que realmente devo interagir com os que alegam "conveniência" e verificar suas fontes. Talvez seja apenas um boato generalizado.
Andreas
O outro fator de conveniência é que um byte pode ser facilmente representado como dois valores hexidecimais. Colocar dois decimais codificados binários (BCD) em um byte é mais comumente chamado de decimal compactado. Isso foi considerado conveniente, pois os decimais podem ser lidos como decimais quando os dados são exibidos em hexadecimal.
JimmyJames 12/08
Os bytes de 12 bits podem ser representados facilmente como três valores hexadecimais. E você pode armazenar três números BCD em um byte de 12 bits. Certamente isso é muito melhor do que dois valores hexadecimais e dois números BCD. Na verdade, um byte de 10 bits pode conter três dígitos decimais. E acho que é assim que o padrão de ponto flutuante decimal IEEE funciona.
precisa saber é o seguinte
1
@ JimmyJames, acho que você obtém a causalidade revertida com hexadecimal. O hexadecimal tornou-se popular porque era uma maneira compacta de representar bytes de 8 bits, anteriormente o octal era muito mais popular (e era mais popular em uma máquina como o PDP-11, que possuía bytes de 8 bits, mas os campos de 3 bits eram significativos. na codificação do conjunto de instruções).
AProgrammer
@ gnasher729, o byte de 8 bits é filho dos anos 60. Passar do char de 6 bits para o char de 12 bits era impensável nos anos 60. Ainda hoje, quando estamos com menos restrições, o UTF-8 é popular porque o UTF-16 é considerado um desperdício demais. Um byte de 10 bits era quase impensável e a codificação de 10 bits por 3 dígitos decimais também é totalmente impraticável quando você está examinando valores em registros e na memória com um painel frontal sem falar sobre o impacto na implementação com a tecnologia da época.
AProgrammer
2

Além do acidente histórico, não há nenhuma razão específica para usarmos 8/16/32/64 bit. Suponho que 12/24/48/96 bit seria realmente mais útil.

Para manipular texto, o Unicode usando um hipotético UTF-24 seria mais barato que o UTF32; o hipotético UTF-12 armazenaria todos os caracteres UTF-8 de um e dois bytes em 12 bits, e todos os caracteres UTF-8 de três e quatro bytes em 24 bits (o intervalo seria ligeiramente reduzido para 2 ^ 20 caracteres, mas ainda é quatro vezes mais do que é generosamente usado); código seria mais simples porque existem apenas duas variantes.

Para ponto flutuante, 48 bits é geralmente suficiente. 96 bits é substancialmente melhor que 80 bits estendido. 24 bits é útil para gráficos; muito mais útil do que os 16 bits suportados por algumas placas gráficas. Ponteiros de 48 bits podem lidar com 256 terabytes.

A única desvantagem são as matrizes de bits, nas quais uma divisão por 12 é necessária para calcular as posições de bytes. Se isso é importante, tenho certeza de que a divisão por 12 pode ser implementada com bastante eficiência no hardware.

gnasher729
fonte
Ponto interessante sobre a UTF, embora seja um pouco fora de tópico. O tamanho de byte de ponto flutuante (ou bit) é uma batalha sem fim entre memória e precisão, onde você apenas precisa conviver com um ou outro. Bom ponto sobre matrizes de bits também.
Andreas
1
Pensamentos interessantes, mas não tenho certeza se isso responde à pergunta.
1
A pergunta era: "Por que oito bits é considerado conveniente"? Certamente dizer "não é" responde à pergunta.
precisa saber é o seguinte
1
@ gnasher729 A pergunta era: "Por que a potência de dois bits por byte é considerada conveniente", embora sua resposta pareça se aplicar da mesma forma.
precisa saber é o seguinte
2
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
yannis
2

Isso é conveniente devido às arquiteturas de hardware comuns que usam múltiplos de 8, por exemplo, arquiteturas de 32 e 64 bits. Isso significa maior eficiência ao usar armazenamento e transmissão de dados de 8 bits.

"No entanto, considerações de economia no design pressionam fortemente por um tamanho ou muito poucos tamanhos relacionados por múltiplos ou frações (submúltiplos) a um tamanho primário. Esse tamanho preferido se torna o tamanho da palavra da arquitetura".

Word (arquitetura de computador)

Veja também: Qual é o histórico de por que os bytes têm oito bits?

Brad Thomas
fonte
5
Não vou aceitar isso como resposta. Minha pergunta é por que a potência de dois é conveniente, não por que o padrão defacto é de 8 bits. E a história por trás de 8 bits menciona 5, 6 e 7 bits sendo usados ​​por razões reais, enquanto que de 7 para 8 é motivado com um "meh, por que não"? Tive a impressão de que diferentes fontes que a potência de dois tinha mais do que compatibilidade com os sistemas atuais. (Na realidade, a paridade de conjuntos de caracteres de 8 bits e de 7 bits de 8 bits.) O Word é uma coisa diferente em que eu recebo o benefício de tamanhos de dois tamanhos, ou seja, shift pode ser usado em vez de mult nos cálculos.
Andreas
3
@RobertHarvey Esta pergunta não é sobre o número de estados por comutador (por exemplo, binário versus trinário ou mais), é sobre quantos comutadores agrupar. Veja minha edição da pergunta.
precisa saber é o seguinte
2
Quanto à sua edição, não há distinção significativa entre o número de bits por byte e o número de valores por byte. São duas maneiras de expressar a mesma coisa. O número de valores que um byte pode conter segue diretamente do número de bits que ele contém: um byte tem 8 bits e, portanto, pode conter valores até 2⁸-1.
Robert Harvey
2
Logicamente, segue-se que você escolhe um tamanho para byte que pode conter um intervalo numérico conveniente. O ASCII é de 7 bits, pois fornece 128 valores diferentes, o suficiente para codificar os dois casos do alfabeto romano, caracteres numéricos, pontuação, caracteres de controle e vários caracteres especiais. Um byte pode conter 7 bits ASCII e um bit de paridade para verificação de erros, para um total de 8 bits, adequado para um tipo de teletipo. Desde então, usamos esse tamanho para um byte.
Robert Harvey
2
@JeremyKato Os dispositivos que mencionei são mais antigos (era dos anos 60-80, na maior parte), e é provavelmente por isso que você não os conhece. ASCII, na verdade é uma codificação de 7 bits (a paridade não faz parte do padrão). Mas para a parte principal do seu comentário, não, não estou perdendo nada. Entendo que há razões pelas quais 8 bits especificamente são convenientes, o que você e Robert Harvey estão perdendo é que a pergunta é sobre potências de 2 bits em geral , e não especificamente 8 bits.
precisa saber é o seguinte
1

De acordo com o artigo da Wikipedia por palavra , isso facilita significativamente os cálculos relacionados ao endereçamento de memória:

Quantidades diferentes de memória são usadas para armazenar valores de dados com diferentes graus de precisão. Os tamanhos geralmente usados ​​são geralmente uma potência de dois múltiplos da unidade de resolução de endereço (byte ou palavra). A conversão do índice de um item em uma matriz para o endereço do item requer apenas uma operação de deslocamento em vez de uma multiplicação. Em alguns casos, esse relacionamento também pode evitar o uso de operações de divisão. Como resultado, os designs mais modernos de computadores possuem tamanhos de palavras (e outros tamanhos de operandos) com capacidade duas vezes maior que um byte.

vartec
fonte
2
Sim, potência de duas vezes o tamanho de um byte. Não há nenhuma razão inerente para que um byte tenha oito bits e não nove, doze ou quinze.
gnasher729
@ gnasher729, muito mais fácil de divisão por 8 (ou 16 ou 32 ou 64) que é para dividir por 9 ou 12 ou 15.
Robert Bristow-Johnson
@ gnasher729 se a palavra é poder-of-2 bits e bytes potência de 2, isto implica que byte tem que ser pedaços potência de 2
vartec
@vartec O artigo e a citação dizem "Os tamanhos geralmente usados ​​são uma potência de dois múltiplos da unidade de resolução de endereço (byte ou palavra)" e "os designs mais modernos de computadores têm tamanhos de palavra (e outros tamanhos de operando) que são uma potência de duas vezes o tamanho de um byte ". Eu li "tamanho da palavra" é medido em bytes, não bits. Não há uma regra sobre o tamanho da palavra em bits é ou deve ter potências de 2 no artigo.
Andreas
@artec: SE. Obviamente, ninguém construiria uma máquina com palavras de 32 bits e bytes de 12 bits. Mas nada fala contra uma máquina com palavras de 48 ou 96 bits e bytes de 12 bits. E houve máquinas em que uma palavra tinha dez bytes.
precisa saber é o seguinte
0

Está intimamente relacionado ao espaço de endereço. Ao adicionar um pouco mais ao seu barramento de endereços, você pode endereçar o dobro de locais de memória. Portanto, quando você adiciona essa linha extra, pode usá-la em toda a extensão.

Isso leva a uma progressão natural de 1, 2, 4, 8, 16, 32 e etc.

No nível técnico de produção, também é fácil repetir o mesmo padrão litográfico. Ou seja, dobrá-lo. Se você começar com uma trava e depois dobrar o padrão, passará 8, não 6, 10 ou 12.

Martin Maat
fonte
1
Como isso está relacionado ao número de bits em um byte? Você está afirmando seriamente que um AND lógico de 32 bits é mais fácil de implementar do que 36 ou 28 bits?
gnasher729
1
Eu não fiz tal afirmação. Minha sugestão é que ela decorre de projetos anteriores que foram progressivamente estendidos em meio à medida que os transistores ficavam mais baratos e os CIs permitiam circuitos menores.
Martin Maat
1
Teoria interessante sobre o nível técnico de produção. Você pode estar no caminho certo. Você poderia estender o parágrafo ou talvez fornecer um link explicando o básico?
Andreas
1
Não faz sentido. Por exemplo, em uma placa gráfica em que todos os tipos de tamanhos de bits ímpares são necessários em vários lugares, tudo é feito exatamente com o tamanho necessário e não um pouco mais. Se um decodificador h.264 precisar de uma precisão de 19 bits para alguma operação, o hardware implementará 19 bits e não 20 ou 24 ou 32. Com licença, você não manipula padrões litográficos. Você define o hardware e o executa através de algum software que cria o layout.
precisa saber é o seguinte
1
@ MartinMaat: Você está confundindo marketing + padronização com razões tecnológicas. E a tecnologia é o que estamos discutindo.
precisa saber é o seguinte
0

Nem sempre as larguras de palavras são poder de dois. Recentemente, venho desenvolvendo algumas codificações em um SHArC DSP que possui uma largura de palavra de 32 bits para números, mas não para os opcodes (que possuem largura de 48 bits).

Provavelmente, a razão pela qual a largura das palavras é uma potência de dois é por causa de algumas instruções que testam (ou definem ou limpam ou alternam) um único bit ou deslocam (ou giram) para a esquerda ou direita por um número especificado de bits. Há um campo de bits no código de operação para especificar a localização do bit único ou o número de bits a serem deslocados. Se a largura da palavra for uma potência de dois, esse campo de bit exigirá log 2 (largura da palavra) bits para cobrir a palavra inteira. Ou seja, uma palavra com 32 bits de largura precisa de um campo de 5 bits no código de operação para essas operações. Se a palavra tivesse 33 bits de largura, precisaria de 6, caso contrário não poderia abranger a palavra inteira, mas também seria o caso se a palavra tivesse 64 bits de largura.

Os bits em um código de operação são extremamente valiosos, portanto, eles geralmente não querem desperdiçá-los. Então faz sentido tornar a palavra uma potência de 2 de largura.

A razão pela qual os bytes têm 8 bits de largura é que é a menor potência de dois que pode conter um caractere ASCII (que é de 7 bits).

Robert Bristow-Johnson
fonte
Esta não é minha área de especialização, mas parece uma razão válida para a potência de dois bytes E tamanhos de palavras. Eu imagino que você também precisa se preocupar menos com o UB. Para um turno, 33 bits exigiriam código de operação de 6 bits, mas apenas cerca da metade dos valores possíveis (0-32) têm um significado útil. Você concordaria?
Andreas
o código de operação precisa ser maior que o campo de bits necessário para a contagem de turnos. um byte nada mais é do que uma palavra com 8 bits. a razão pela qual o hardware do computador tende a usar tamanhos de palavras de 8 ou 16 ou 32 ou 64 bits (nem sempre é o caso, o antigo DSP56000 tinha palavras de 24 bits) é por causa dos motivos que eu mencionei acima e do vartec : dado um bitmap de palavras compactadas e você recebe um número de linha e coluna de um pixel específico, é necessário dividir o número da coluna pela largura da palavra para saber qual palavra acessar para testar ou alterar o pixel. dividir por uma potência de 2 é fácil.
22816 Robert Bristow-Johnson
O que é um "bitmap de palavras compactadas"? O HighColor combina com essa descrição?
Andreas
@ robertbristow-johnson: total falta de imaginação. Com bytes de 9 bits, usaríamos palavras de 36 bits, 130 milhões de cores em vez de 16 milhões de cores em RGBA, RGB666 em vez de RGB555 ou a monstruosidade RGB565 para cores de baixa qualidade, e tudo ficaria bem. E o ASCII incluiria 512 caracteres até o Latin Extended.
precisa saber é o seguinte
@ Andréas, não, eu quis dizer duas "cores". totalmente branco ou totalmente preto.
Robert Bristow-johnson