¿Un byte contiene 8 bits o 9?

56

Leí en este tutorial de programación de ensamblaje que 8 bits se usan para datos mientras que 1 bit es para paridad, que luego se usa para detectar errores de paridad (causados ​​por fallas de hardware o perturbaciones eléctricas).

¿Es esto cierto?

xtt
fuente
55
Vea cs.stackexchange.com/a/19851/584 para una discusión sobre lo que puede ser un byte .
Programador
63
Ese artículo está lleno de tonterías y debes ignorarlo.
David Schwartz
12
Si quieres ser pedante, simplemente llámalos "octetos". Ese artículo está escrito con un procesador muy específico en mente (uno que debe mantener los bits de paridad en la ROM por alguna razón ...) o simplemente es una locura. Los PIC de Microchip, por ejemplo, usan una longitud de palabra de 14 bits. Toda la memoria del programa está organizada en una matriz de N x 14 bits.
Nick T
13
@NickT: sin embargo, no son lo mismo. Un octeto siempre tiene 8 bits, un byte puede ser cualquier cosa.
Jörg W Mittag
44
El artículo puede haber estado haciendo referencia a los mecanismos de corrección de memoria utilizados en algunas de las primeras PC de IBM, pero afirmar que "el byte es 8 bits de datos + 1 bit de paridad" no tiene sentido. Como ejemplo, los CD-ROM generalmente usan mecanismos de corrección de errores que son mucho más codiciosos: un CD de audio típico usará 8 bytes por 24 bytes de datos de audio. Pero la parte más importante es que no te importa . En absoluto. Es exclusivo del mecanismo de almacenamiento de memoria real: a la CPU no le importa, a su código no le importa.
Luaan

Respuestas:

78

Un byte de datos es de ocho bits, puede haber más bits por byte de datos que se utilizan en el sistema operativo o incluso en el nivel de hardware para la verificación de errores (bit de paridad, o incluso un esquema de detección de errores más avanzado), pero los datos son ocho bits y cualquier bit de paridad suele ser invisible para el software. Un byte ha sido estandarizado para significar 'ocho bits de datos'. El texto no está mal al decir que puede haber más bits dedicados al almacenamiento de un byte de datos que los ocho bits de datos, pero esos no suelen considerarse parte del byte per se, el texto en sí mismo apunta a este hecho.

Puede ver esto en la siguiente sección del tutorial:

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

4 * 8 = 32, en realidad podría ocupar 36 bits en el sistema, pero para sus propósitos y propósitos son solo 32 bits.

JustOnotherSoul
fuente
55
Bueno, si el hardware implementa la detección de errores, probablemente lo haría con fragmentos de memoria más grandes que un byte, como con sectores de 512 bytes más o menos ... de esta manera puede reducir la sobrecarga de memoria adicional necesaria. Solo para aclarar: incluso con la corrección de errores, el hardware todavía usa 8 bits por byte más algunos bits para cada "fragmento" de datos, que probablemente sea mucho más grande que un solo byte.
Bakuriu
11
Tenga en cuenta que hay sistemas con bytes no visibles de software de 8 bits. Ver ¿Qué plataformas tienen algo más que char de 8 bits? pregunta en StackOverflow.
Ruslan
3
Sí, de hecho existen. Aunque ese enlace en particular está hablando de caracteres que no son de 8 bits. Por así decirlo: el byte solía referirse simplemente a la cantidad de bits que un sistema determinado tomó para almacenar un 'char', que era tan bajo como seis bits. Pero IIRC está estandarizado en la especificación IEC-80000 de que un byte es de 8 bits. A medida que te alejas de los sistemas convencionales, encuentras rarezas, por supuesto, y los estándares no son leyes.
JustAnotherSoul
3
@JustAnotherSoul: Y hay estándares competitivos que definen el byte como "al menos 8 bits" o de otras maneras. Es interesante ver cómo décadas después la definición de byte cambia en la mente de las personas. En la época de mucha más heterogeneidad arquitectónica, el byte era simplemente la unidad direccionable más pequeña de su arquitectura (mire varios PDP para ver ejemplos). Esta es también la razón por la que en el advenimiento de Internet se usó el término octeto para describir los datos en el cable, ya que el byte no era una palabra universal para una porción de datos de 8 bits.
PlasmaHH
2
@JustAnotherSoul tenga charen cuenta que en C (que es de lo que se trata el enlace) es exactamente la unidad de memoria direccionable más pequeña. Simplemente se llama char , pero el estándar C lo convierte en sinónimo de byte .
Ruslan
48

Tradicionalmente, un byte puede ser de cualquier tamaño y es la unidad de memoria direccionable más pequeña. En estos días, los bytes de 8 bits se han estandarizado para el software. Como dijo JustAnotherSoul, el hardware puede almacenar más bits que los 8 bits de datos.

Si está trabajando en dispositivos lógicos programables, como FPGA, es posible que vea que su memoria interna a menudo es direccionable como fragmentos de 9 bits, y como autor de HDL, puede usar ese noveno bit para la verificación de errores o simplemente para almacenar grandes cantidades de datos por "byte". Al comprar chips de memoria para hardware personalizado, generalmente tiene la opción de unidades direccionables de 8 o 9 bits (o 16/18, 32/36, etc.), y luego depende de usted si tiene "bytes" de 9 bits y qué lo haces con ese noveno bit si eliges tenerlo.

Extrarius
fuente
10
En general, cuando hay un grupo de datos que es lógicamente una sola unidad pero contiene más / menos de 8 bits, se denomina "palabra". Por ejemplo, algunos procesadores usan una palabra de instrucción de 40 bits.
Devsman
3
+1. Por cierto, ha habido arquitecturas con "punteros de bits" y "punteros de bytes". En tales arquitecturas, un byte técnicamente no es "la unidad de memoria direccionable más pequeña" (ya que puede direccionar cada bit de forma independiente), aunque es difícil decir sucintamente qué es . Supongo que es una especie de "Lo sé cuando lo veo". :-P
ruakh
18
"Octeto" era la palabra usada tradicionalmente para significar "lo llamaría un byte, pero realmente quiero decir exactamente 8 bits" para varios protocolos de comunicación entre sistemas que pueden tener diferentes tamaños de bytes. Pero en estos días, usar byte para significar cualquier cosa menos 8 bits es anacrónico.
wnoise
@Devsman No necesariamente. Los chips x86 tienen palabras de 32 bits y bytes de 8 bits, por ejemplo. Un byte es el tamaño direccionable más pequeño. La palabra está un poco más vagamente definida, pero tiende a ser el tamaño con el que es más conveniente trabajar; es decir, la longitud esperada del operando de la mayoría de las instrucciones.
Ray
Esto debe ser marcado como la respuesta correcta, es más correcto.
awiebe
32

Ese texto está extremadamente mal redactado. Es casi seguro que está hablando de RAM ECC (código de corrección de errores) .

La memoria RAM de ECC comúnmente almacenará información de 8 bits utilizando 9 bits. El bit por byte adicional se usa para almacenar códigos de corrección de errores.

ECC vs no ECC (En ambos casos, cada byte se distribuye en cada chip. Imagen cortesía de Puget Systems )

Todo esto es completamente invisible para los usuarios del hardware. En ambos casos, el software que usa esta RAM ve 8 bits por byte.


Como comentario aparte: los códigos de corrección de errores en RAM generalmente no son en realidad 1 bit por byte; son, en cambio, 8 bits por 8 bytes. Esto tiene la misma sobrecarga de espacio, pero tiene algunas ventajas adicionales. Ver SECDED para más información.

BlueRaja - Danny Pflughoeft
fuente
12
Parity RAM y ECC RAM son cosas diferentes. La RAM de paridad almacena un bit adicional por dominio de error, puede detectar todos los errores de un solo bit y ningún error de doble bit, y no puede solucionar nada. ECC almacena una cantidad de bits adicionales por dominio de error, puede detectar y corregir todos los errores de un solo bit, puede detectar pero no corregir todos los errores de doble bit y puede detectar algunos errores más grandes. La RAM de paridad es rara en estos días, ya que ha sido reemplazada casi por completo por la RAM ECC.
Mark
1
@ Mark: Insinué que en mi último párrafo, hay más detalles en el enlace. La RAM de paridad es básicamente inexistente en estos días porque un código de corrección de errores (72,64) tiene la misma sobrecarga que un código de paridad (9,8).
BlueRaja - Danny Pflughoeft
77
Mientras lo insinúa, también declara cosas que lo hacen impreciso / confuso. La RAM ECC no "almacena información de 8 bits utilizando 9 bits". Dicho esto implica que puedes hacer ECC para 8 bits usando 9 bits, lo cual no es posible. Para 8 bits de información discreta, 1 bit adicional es suficiente para detectar , no corregir, errores de un solo bit. Los ECC usan un mayor número de bits o bytes para contener datos suficientes para corregir errores para grupos de datos, generalmente más grandes que un solo byte. Si bien esto puede promediar un bit adicional por 8 bits, no se puede dividir en asociar solo 1 bit con cada 8 bits.
Makyen
Hay un esquema de 36 bits (palabra de 32 bits + ECC de 4 bits) que permite la corrección de errores de un solo bit y la detección de errores de dos bits. Si bien puede dividirlo aritméticamente en 8 bits de datos + 1 bit ECC, no puede / no funciona de esa manera. Se requieren los 4 bits completos de ECC, que cubre 32 bits de datos.
Zenilogix
@Zenilogix y otros que repitieron lo mismo: entiendo muy bien cómo funciona ECC, y nada de lo que dije fue incorrecto. Nunca afirmé que el ECC de 8 bits se puede hacer con 9 bits, dije que la RAM de ECC usa 9 bits por byte de almacenamiento. El funcionamiento de ECC está completamente fuera del alcance de esta pregunta, por lo que dejé los detalles como un aparte con un enlace. Por favor, detenga todos los comentarios pedantes.
BlueRaja - Danny Pflughoeft
16

En términos generales, la respuesta corta es que un byte es de 8 bits. Esto simplifica demasiado el asunto (a veces incluso hasta el punto de inexactitud), pero es la definición con la que la mayoría de las personas (incluida una gran cantidad de programadores) está familiarizada, y la definición que casi todo el mundo usa de manera predeterminada (independientemente de cuántos bytes de diferente tamaño tengan '' he tenido que trabajar con).

Más específicamente, un byte es la unidad de memoria direccionable más pequeña para la arquitectura dada, y generalmente es lo suficientemente grande como para contener un solo carácter de texto. En la mayoría de las arquitecturas modernas, un byte se define como 8 bits; ISO / IEC 80000-13 también especifica que un byte es de 8 bits, al igual que el consenso popular (lo que significa que si habla de, digamos, bytes de 9 bits, se encontrará con muchos problemas a menos que explícitamente declare que no quiere decir bytes normales).

Sin embargo, hay excepciones para esta regla. Por ejemplo:

Entonces, en la mayoría de los casos, un byte generalmente será de 8 bits. Si no, es probable que sea ​​de 9 bits, y puede o no ser parte de una palabra de 36 bits.

Justin Time 2 restablece a Monica
fuente
8

Tenga en cuenta que el término byte no está bien definido sin contexto. En lo que respecta a las arquitecturas informáticas, puede suponer que un byte es de 8 bits, al menos para las arquitecturas modernas. Esto se estandarizó en gran medida mediante lenguajes de programación como C, que requería que los bytes tuvieran al menos 8 bits pero no proporcionaba ninguna garantía para bytes más grandes, por lo que 8 bits por byte era la única suposición segura.

Hay computadoras con unidades direccionables de más de 8 bits (generalmente 16 o 32), pero esas unidades generalmente se llaman palabras de máquina, no bytes. Por ejemplo, un DSP con 32K palabras de 32 bits de RAM se anunciaría con 128 KB o RAM, no 32 KB.

Las cosas no están tan bien definidas cuando se trata de estándares de comunicación. ASCII todavía se usa ampliamente y tiene bytes de 7 bits (que encajan muy bien en bytes de 8 bits en las computadoras). Los transceptores UART todavía se producen para tener un tamaño de byte configurable (por lo general, puede elegir al menos entre 6, 7 y 8 bits por byte, pero 5 y 9 no son desconocidos).

Dmitry Grigoryev
fuente
6

Un byte generalmente se define como la unidad de espacio de memoria direccionable individualmente más pequeña. Puede ser de cualquier tamaño. Ha habido arquitecturas con tamaños de bytes entre 6 y 9 bits, quizás incluso más grandes. También hay arquitecturas donde la única unidad direccionable es el tamaño del bus, en tales arquitecturas podemos decir que simplemente no tienen byte , o el byte es del mismo tamaño que la palabra (en un caso particular, sé que eso sería ser de 32 bits); De cualquier manera, definitivamente no es de 8 bits. Del mismo modo, hay arquitecturas direccionables en bits, en esas arquitecturas, nuevamente podríamos argumentar que los bytes simplemente no existen, o podríamos argumentar que los bytes son de 1 bit; De cualquier manera es una definición sensata, pero 8 bits definitivamente está mal.

En muchas arquitecturas convencionales de uso general, un byte contiene 8 bits. Sin embargo, eso no está garantizado. Cuanto más se aleje de la CPU principal y / o de las CPU de uso general, es más probable que encuentre bytes que no sean de 8 bits. Esto llega tan lejos que algunos programas altamente portátiles incluso hacen que el tamaño sea configurable. Por ejemplo, las versiones anteriores de GCC contenían una macro llamada BITS_PER_BYTE(o algo así), que configuraba el tamaño de un byte para una arquitectura particular. Creo que algunas versiones anteriores de NetBSD podrían ejecutarse en arquitecturas que no sean de 8 bits por byte.

Si realmente desea enfatizar que está hablando de una cantidad exacta de 8 bits en lugar de la menor cantidad de memoria direccionable, por grande que sea, puede usar el término octeto , que se usa, por ejemplo, en muchos RfC más nuevos.

Jörg W Mittag
fuente
2
Estándar C y C ++ tienen una macro predefinida CHAR_BIT(que se encuentra en limits.h), no estoy al tantoBITS_PER_BYTE
njuffa
3

Cuando comencé a programar en 1960, teníamos palabras de 48 bits con bytes de 6 bits: entonces no se llamaba ese nombre, se llamaban caracteres. Luego trabajé en la computadora Golem con palabras de 75 bits y bytes de 15 bits. Más tarde, los bytes de 6 bits eran la norma, hasta que IBM salió con el 360, y hoy en día un byte es comúnmente equivalente a un octeto, es decir, 8 bits de datos. Algunos equipos tenían bits adicionales para la detección de errores y posiblemente para la corrección de errores, pero el software no podía acceder a ellos.

Jonathan Rosenne
fuente
3

Un byte es de 8 bits.

En el pasado distante, había diferentes definiciones de una palabra de memoria y de un byte. La sugerencia de que esta ambigüedad es generalizada o prevalece en la vida actual es falsa.

Desde al menos finales de la década de 1970, un byte ha sido de 8 bits. La población masiva de computadoras y PC domésticas ha utilizado sin ambigüedad un byte como valor de 8 bits en su documentación, al igual que todas las hojas de datos y documentación para unidades de disquete, unidades de disco duro y PROM / EPROM / EEPROM / Flash EPROM / SRAM / SDRAM chips de memoria que he leído en ese período de tiempo. (Y personalmente he leído una gran cantidad de ellos en ese período de tiempo). Ethernet y un par de otros protocolos de comunicación me parecen inusuales al hablar de octetos.

La ambigüedad del término byte es en sí misma algo raro y oscuro. Muy, muy pocos de la población de programadores, ingenieros de diseño, ingenieros de prueba, vendedores, ingenieros de servicio o apostadores promedio en los últimos 30 años o más pensarían que significa algo más que un valor de 8 bits, si reconocen la palabra. .

Cuando el hardware maneja un byte, como cuando se almacena en chips de memoria o se comunica a lo largo del cable, el hardware puede agregar datos redundantes al byte. Esto puede ayudar más tarde a detectar errores de hardware para que los datos poco confiables puedan reconocerse y descartarse (por ejemplo, paridad, suma de verificación, CRC). O puede permitir que se corrijan errores en los datos y se recuperen los datos (por ejemplo, ECC). De cualquier manera, los datos redundantes se descartarán cuando el byte se haya recuperado o recibido para su posterior procesamiento. El byte sigue siendo el valor central de 8 bits y los datos redundantes siguen siendo datos redundantes.

TonyM
fuente
2

Primero, el tutorial al que hace referencia parece estar bastante desactualizado y parece estar dirigido a versiones desactualizadas de procesadores x86, sin decirlo, por lo que muchas de las cosas que lee allí no serán entendidas por otros (por ejemplo, si afirma que una PALABRA es de 2 bytes, la gente no sabrá de lo que estás hablando o sabrán que te han enseñado sobre la base de procesadores x86 muy obsoletos y sabrán qué esperar).

Un byte es cualquier número de bits que alguien decida que debería ser. Puede ser de 8 bits, 9 bits o 16 bits, cualquier cosa. En 2016, en la mayoría de los casos, un byte será de ocho bits. Para estar seguro, puede usar el término octeto: un octeto es siempre, siempre, ocho bits.

La verdadera confusión aquí es confundir dos preguntas: 1. ¿Cuál es el número de bits en un byte? 2. Si quisiera transferir un byte de un lugar a otro, o si quisiera almacenar un byte, utilizando medios físicos prácticos, ¿cómo lo haría? La segunda pregunta suele ser de poco interés para usted, a menos que trabaje en una empresa que fabrica módems, discos duros o unidades SSD. En la práctica, le interesa la primera pregunta, y para la segunda simplemente dice "bueno, alguien se ocupa de eso".

El bit de paridad que se mencionó es un mecanismo primitivo que ayuda a detectar que cuando un byte se almacena en la memoria, y luego se lee el byte, la memoria ha cambiado por algún accidente. No es muy bueno para eso, porque no encontrará que se hayan cambiado dos bits, por lo que es probable que no se detecte un cambio, y no puede recuperarse del problema porque no hay forma de averiguar cuál de los 8 bits ha cambiado , o incluso si el bit de paridad ha cambiado.

Los bits de paridad prácticamente no se usan en esa forma primitiva. Los datos que se almacenan permanentemente generalmente se protegen de formas más complicadas, por ejemplo, agregando una suma de verificación de 32 bits o más a un bloque de 1024 bytes, lo que ocupa mucho menos espacio adicional (0.4% en este ejemplo en lugar de 12.5%) y es mucho es menos probable que no se entere cuando algo está mal.

gnasher729
fuente
Realmente desactualizado: el "párrafo" de 16 bytes no ha sido una unidad de memoria significativa desde el cambio del modo real y el direccionamiento segmentado.
Mark
Personalmente, asumiría "WinAPI" cuando alguien habla de 2 bytes WORD, lo que ... prueba un poco tu punto, ya que muchos de los nombres de tipo WinAPI están desactualizados pero se mantienen por compatibilidad con versiones anteriores. xP
Justin Time 2 Restablece a Monica el
1

A pesar de las excelentes respuestas dadas aquí, me sorprende que nadie haya señalado que los bits de paridad o los bits de corrección de errores son, por definición, 'metadatos' y, por lo tanto, no forman parte del byte.

¡Un byte tiene 8 bits !

usuario34445
fuente
0

En el uso moderno, un byte es de 8 bits, punto (aunque históricamente ha tenido otras definiciones). Por otro lado, una palabra de datos es lo que el hardware en cuestión maneja como una unidad atómica; podría ser 8 bits, 9 bits, 10 bits, 12 bits, 16 bits, 20 bits, 24 bits, 32 bits, etc. Los sistemas a lo largo de los años han tenido todo tipo de tamaños de palabras diferentes.

Para implementar un sistema de memoria o un protocolo de transmisión, es beneficioso agregar detección / corrección de errores que involucra bits adicionales. No hacen un byte de 9 bits porque, como se indicó anteriormente, un byte es de 8 bits.

Varios esquemas agregan detección y / o corrección de errores de varias maneras.

El uso típico de la paridad es agregar un bit extra a la palabra de transmisión para que el receptor pueda detectar un solo bit de error.

Un esquema que puede proporcionar corrección de errores de un solo bit implica la adición de 4 bits ECC por palabra de datos de 32 bits. Esto resulta ser aritméticamente equivalente a 1 bit por byte, pero no puede / no funciona de esa manera. Una palabra de datos de 36 bits puede contener suficiente información para recuperarse de un error de un solo bit para un espacio de datos de 32 bits.

Zenilogix
fuente
0

8 bits Dentro de la CPU y el teclado, es de 9 y 11 bits. Sin embargo, los datos del usuario se representan en 8 bits. Las teclas del teclado envían canciones que se dividen en 11 bits. 1 bit de inicio, 1 bit de finalización, 1 bit de paridad y 8 bits que representan una tecla presionada.

Siva
fuente
2
¿Responde esto la pregunta? ¿Te refieres a diferentes longitudes para bytes en CPU y bytes en teclado? ¿Deberían "cantarse" ser "cadenas" o "secuencias"?
Apass.Jack
Parece que estás hablando de un protocolo de cable que incluye datos de trama, no los datos reales en sí.
Peter Cordes
Supongo que "canta" son "señales", yo mismo, @ Apass.Jack.
Justin Time 2 Restablece a Monica el