math - ¿Por qué son 8 y 256 números tan importantes en ciencias de la computación?
memory history (10)
Charles Petzold escribió un interesante libro llamado Code que cubre exactamente esta pregunta. Ver capítulo 15, Bytes y Hex.
Citas de ese capítulo:
Los valores de ocho bits son entradas para los sumadores, los cierres y los selectores de datos, y también las salidas de estas unidades. Los valores de ocho bits también se definen mediante interruptores y se muestran mediante bombillas. Por lo tanto, se dice que la ruta de datos en estos circuitos tiene 8 bits de ancho . Pero ¿por qué 8 bits? ¿Por qué no 6 o 7 o 9 o 10?
... realmente no hay razón para que haya que construirlo de esa manera. Ocho bits parecían en ese momento ser una cantidad conveniente, un buen bocado de bits, por así decirlo.
... Durante un tiempo, un byte significaba simplemente la cantidad de bits en una ruta de datos particular. Pero a mediados de los años sesenta. En relación con el desarrollo de IBM System / 360 (su gran complejo de computadoras de negocios), la palabra llegó a significar un grupo de 8 bits.
... Una razón por la que IBM gravitó hacia bytes de 8 bits fue la facilidad para almacenar números en un formato conocido como BCD. Pero como veremos en los capítulos siguientes, casi por casualidad, un byte es ideal para almacenar texto porque la mayoría de los idiomas escritos en todo el mundo (con la excepción de los ideogramas utilizados en chino, japonés y coreano) se pueden representar con menos de 256 caracteres.
No sé muy bien acerca de la arquitectura RAM y HDD, o cómo la electrónica se ocupa de los fragmentos de memoria, pero esto siempre provocó mi curiosidad: ¿por qué elegimos detenernos en 8 bits para obtener el elemento más pequeño en un valor de computadora?
Mi pregunta puede parecer muy tonta, porque la respuesta es obvia, pero no estoy muy seguro ...
¿Es porque 2 ^ 3 le permite encajar perfectamente cuando se dirige a la memoria? ¿La electrónica está especialmente diseñada para almacenar trozos de 8 bits? Si es así, ¿por qué no usar palabras más amplias? ¿Se debe a que divide 32, 64 y 128, de modo que a las palabras del procesador se les pueden dar varias de esas palabras? ¿Es conveniente tener un valor de 256 para un espacio tan pequeño?
Qué piensas ?
Mi pregunta es demasiado metafísica, pero quiero asegurarme de que sea solo una razón histórica y no una razón tecnológica o matemática.
Para la anécdota, también estaba pensando en el estándar ASCII, en el que la mayoría de los primeros personajes son inútiles con cosas como UTF-8, también estoy tratando de pensar en una codificación de caracteres más pequeña y rápida ...
Creo que la razón principal tiene que ver con el diseño original de la PC de IBM. La CPU Intel 8080 fue el primer precursor de la 8086 que luego se usaría en la PC de IBM . Tenía registros de 8 bits. Por lo tanto, todo un ecosistema de aplicaciones se desarrolló alrededor de la metáfora de 8 bits. Para conservar la compatibilidad con versiones anteriores, Intel diseñó todas las arquitecturas posteriores para conservar registros de 8 bits. Por lo tanto, las 8086 y todas las CPU x86 mantuvieron sus registros de 8 bits por compatibilidad con versiones anteriores, a pesar de que agregaron nuevos registros de 16 y 32 bits a lo largo de los años.
La otra razón por la que puedo pensar es que 8 bits es perfecto para ajustar un conjunto de caracteres básicos en latín. No puede encajar en 4 bits, pero sí en 8. Por lo tanto, obtiene el conjunto de caracteres ASCII de 256 valores. También es la potencia más pequeña de 2 para la cual tienes suficientes bits en los que puedes encajar un conjunto de caracteres. Por supuesto, en estos días, la mayoría de los conjuntos de caracteres son en realidad de 16 bits de ancho (es decir, Unicode).
Dado que las computadoras funcionan con números binarios, todos los poderes de dos son importantes.
Los números de 8 bits son capaces de representar 256 (2 ^ 8) valores distintos, suficientes para todos los caracteres del inglés y unos cuantos más. Eso hizo que los números 8 y 256 fueran muy importantes.
El hecho de que muchas CPU (usadas y aún lo hacen) procesan datos en 8 bits ayudó mucho.
Otros poderes importantes de los dos de los que podrías haber oído hablar son 1024 (2 ^ 10 = 1k) y 65536 (2 ^ 16 = 65k).
El número importante aquí es binario 0
o 1
. Todas sus otras preguntas están relacionadas con esto.
Claude Shannon y George Boole hicieron el trabajo fundamental en lo que ahora llamamos teoría de la información y aritmética booleana. En resumen, esta es la base de cómo un interruptor digital, con solo la capacidad de representar 0 OFF
y 1 ON
puede representar información más compleja, como números, lógica y una foto jpg. Binario es la base de las computadoras tal como las conocemos actualmente, pero otras computadoras de base numérica o computadoras analógicas son completamente posibles.
En la aritmética decimal humana, los poderes de diez tienen importancia. 10, 100, 1000, 10,000 cada uno parece importante y útil. Una vez que tienes una computadora basada en binario, hay poderes de 2, que también son importantes. 2 ^ 8 = 256 es suficiente para un alfabeto, puntuación y caracteres de control. (Lo que es más importante, 2 ^ 7 es suficiente para un alfabeto, puntuación y caracteres de control y 2 ^ 8 es suficiente espacio para esos caracteres ASCII y un bit de verificación ).
Históricamente, los bytes no siempre han tenido un tamaño de 8 bits (para el caso, las computadoras tampoco tienen que ser binarias, pero la computación no binaria ha visto mucha menos acción en la práctica). Es por esta razón que las normas IETF e ISO a menudo usan el término octeto : no usan byte porque no quieren suponer que significa 8 bits cuando no lo hace.
De hecho, cuando se acuñó el byte se definió como una unidad de 1-6 bits. Los tamaños de bytes en uso a lo largo de la historia incluyen 7, 9, 36 y máquinas con bytes de tamaño variable.
8 fue una mezcla de éxito comercial, siendo un número lo suficientemente conveniente para las personas que piensan en ello (que se habrían alimentado entre sí) y, sin duda, otras razones que desconozco por completo.
El estándar ASCII que usted menciona asume un byte de 7 bits y se basó en estándares de comunicación anteriores de 6 bits.
Edición: puede valer la pena agregar a esto, ya que algunos insisten en que los bytes que dicen son siempre octetos, son bytes confusos con palabras.
Un octeto es un nombre dado a una unidad de 8 bits (del latín para ocho). Si está utilizando una computadora (o en un nivel de abstracción más alto, un lenguaje de programación) donde los bytes son de 8 bits, entonces esto es fácil de hacer, de lo contrario, necesita algún código de conversión (o coverion en hardware). El concepto de octeto aparece más en los estándares de redes que en la computación local, ya que al ser neutral en arquitectura permite la creación de estándares que pueden usarse en la comunicación entre máquinas con diferentes tamaños de bytes, de ahí su uso en los estándares IETF e ISO ( incidentalmente, ISO / IEC 10646 usa octeto donde el Estándar Unicode usa el byte para lo que es esencialmente, con algunas restricciones adicionales menores en la última parte, el mismo estándar, aunque el Estándar Unicode detalla que significan octeto por byte aunque los bytes pueden ser diferentes tamaños en diferentes máquinas). El concepto de octeto existe precisamente porque los bytes de 8 bits son comunes (de ahí la opción de usarlos como base de dichos estándares) pero no son universales (de ahí la necesidad de otra palabra para evitar la ambigüedad).
Históricamente, un byte era el tamaño utilizado para almacenar un carácter, un asunto que a su vez se basa en prácticas, estándares y estándares de facto que las computadoras anteriores a la fecha usaban para el télex y otros métodos de comunicación, comenzando tal vez con Baudot en 1870 (no No sé de ninguna anterior, pero estoy abierto a correcciones).
Esto se refleja en el hecho de que en C y C ++ la unidad para almacenar un byte se llama char
cuyo tamaño en bits está definido por CHAR_BIT
en el encabezado de limits.h estándar. Diferentes máquinas usarían 5,6,7,8,9 o más bits para definir un carácter. Estos días, por supuesto, definimos los caracteres como 21 bits y usamos diferentes codificaciones para almacenarlos en unidades de 8, 16 o 32 bits, (y formas no autorizadas por Unicode como UTF-7 para otros tamaños) pero históricamente esa fue la como era
En los lenguajes que pretenden ser más coherentes en todas las máquinas, en lugar de reflejar la arquitectura de la máquina, el byte
tiende a ser fijo en el lenguaje, y en estos días esto generalmente significa que se define en el lenguaje como 8 bits. Dado el punto en la historia en que se hicieron, y que la mayoría de las máquinas ahora tienen bytes de 8 bits, la distinción es en gran medida discutible, aunque no es imposible implementar un compilador, tiempo de ejecución, etc. para dichos idiomas en máquinas con diferentes tamaños. bytes, pero no tan fácil.
Una palabra es el tamaño "natural" para una computadora determinada. Esto se define con menos claridad, porque afecta a unas pocas preocupaciones que se superponen y que, por lo general, coinciden, pero podrían no hacerlo. La mayoría de los registros en una máquina serán de este tamaño, pero algunos no. El tamaño más grande de la dirección normalmente sería una palabra, aunque puede que este no sea el caso (el Z80 tenía un byte de 8 bits y una palabra de 1 byte, pero permitió que algunas duplicaciones de registros dieran un soporte de 16 bits, incluido 16 bits direccionamiento).
Nuevamente, vemos aquí una diferencia entre C y C ++ donde int
se define en términos de tamaño de palabra y se define por long
para aprovechar las ventajas de un procesador que tiene un concepto de "palabra larga" si este existe, aunque posiblemente sea idéntico en un caso determinado a int
. Los valores mínimo y máximo están nuevamente en el encabezado limits.h. (De hecho, a medida que el tiempo transcurre, int
puede definirse como más pequeño que el tamaño de palabra natural, como una combinación de coherencia con lo que es común en otros lugares, reducción en el uso de memoria para una variedad de intentos y probablemente otras preocupaciones que no hago) t sabe de).
Los lenguajes Java y .NET adoptan el enfoque de definir int
y long
fijo en todos los architecutres, y hacer que las diferencias sean un problema para el tiempo de ejecución (particularmente el JITter). Sin embargo, notablemente, incluso en .NET el tamaño de un puntero (en código inseguro) variará dependiendo de la arquitectura para ser el tamaño de palabra subyacente, en lugar de un tamaño de palabra impuesto por idioma.
Por lo tanto, octeto, byte y palabra son muy independientes entre sí, a pesar de que la relación de octeto == byte y palabra es un número entero de bytes (y un número entero de números binarios como 2, 4, 8, etc.) son comunes hoy.
La codificación ASCII requirió 7 bits, y EBCDIC requirió 8 bits. Los códigos ASCII extendidos (como los juegos de caracteres ANSI) usaron el octavo bit para expandir el juego de caracteres con gráficos, caracteres acentuados y otros símbolos. Algunas arquitecturas hicieron uso de codificaciones patentadas; un buen ejemplo de esto es el DEC PDP-10, que tenía una palabra de máquina de 36 bits. Algunos sistemas operativos en esta arquitectura utilizaban codificaciones empaquetadas que almacenaban 6 caracteres en una palabra de máquina para varios propósitos, como nombres de archivos.
En la década de 1970, el éxito de la DG Nova y el DEC PDP-11, que eran arquitecturas de 16 bits y mainframes de IBM con palabras de máquina de 32 bits, estaba empujando a la industria hacia un carácter de 8 bits por defecto. Los microprocesadores de 8 bits de finales de la década de 1970 se desarrollaron en este entorno y esto se convirtió en un estándar de facto, especialmente cuando los dispositivos periféricos disponibles como UART, chips ROM y chips FDC se estaban construyendo como dispositivos de 8 bits.
En la última parte de la década de 1970, la industria se conformó con 8 bits como estándar de facto y arquitecturas como el PDP-8 con su palabra de máquina de 12 bits quedaron algo marginadas (aunque el ISA y los derivados de PDP-8 todavía aparecen en productos de sistemas integrados ). Se siguieron diseños de microprocesadores de 16 y 32 bits, como las familias Intel 80x86 y MC68K.
Las computadoras se basan en la electrónica digital, y la electrónica digital funciona con los estados. Un fragmento puede tener 2 estados, 1 o 0 (si el voltaje está por encima de algún nivel, entonces es 1, si no, entonces es cero). Para representar ese comportamiento se introdujo el sistema binario (no se introdujo, pero sí se aceptó ampliamente).
Así que llegamos a la broca. Bit es el fragmento más pequeño en el sistema binario. Solo puede tomar 2 estados, 1 o 0, y representa el fragmento atómico de todo el sistema.
Para hacer nuestras vidas más fáciles, se introdujo el byte (8 bits). Para darle alguna analogía, no expresamos el peso en gramos, pero esa es la medida básica del peso, pero usamos kilogramos, porque es más fácil de usar y de entender el uso. Un kilogramo son los 1000 gramos, y eso puede expresarse como 10 en la potencia de 3. Así que cuando volvemos al sistema binario y usamos la misma potencia obtenemos 8 (2 en la potencia de 3 es 8). Esto se hizo porque el uso de solo bits era demasiado complicado en la computación de todos los días.
Esto se mantuvo, así que en el futuro, cuando nos dimos cuenta de que 8 bytes eran demasiado pequeños y se complicó su uso, agregamos +1 en la potencia (2 en la potencia de 4 es 16) y luego nuevamente 2 ^ 5 es 32 , y así sucesivamente, y el 256 es solo 2 con el poder de 8.
Entonces, tu respuesta es que seguimos el sistema binario debido a la arquitectura de las computadoras, y aumentamos el valor de la potencia para representar algunos valores que podemos manejar todos los días, y así es como pasaste de un bit a un byte. (8 bits) y así sucesivamente!
(2, 4, 8 , 16, 32, 64, 128, 256 , 512, 1024, etc.) ( 2 x , x = 1,2,3,4,5,6,7,8,9) 10 y así sucesivamente)
No todos los bytes son de 8 bits. Algunos son 7, algunos 9, algunos otros valores en su totalidad. La razón 8 es importante es que, en la mayoría de las computadoras modernas, es el número estándar de bits en un byte. Como mencionó Nikola, un bit es la unidad más pequeña real (un solo valor binario, verdadero o falso).
Como mencionó Will, este artículo http://en.wikipedia.org/wiki/Byte describe el byte y su historia de tamaño variable con más detalle.
El razonamiento general detrás de por qué 8, 256 y otros números son importantes es que son potencias de 2, y las computadoras funcionan con un sistema de conmutadores de base 2 (binario).
Normalmente contamos en base 10, un solo dígito puede tener uno de diez valores diferentes. La tecnología informática se basa en interruptores (microscópicos) que pueden estar encendidos o apagados. Si uno de estos representa un dígito, ese dígito puede ser 1 o 0. Esta es la base 2.
De ahí se sigue que las computadoras trabajan con números que se forman como una serie de 2 dígitos de valor.
- 1 dígito, 2 valores
- 2 dígitos, 4 valores
- 3 dígitos, 8 valores etc.
Cuando se diseñan los procesadores, tienen que elegir un tamaño con el que el procesador estará optimizado para trabajar. Para la CPU, esto se considera una "palabra". Las CPU anteriores se basaban en tamaños de palabra de fourbits y poco después de 8 bits (1 byte). Hoy en día, las CPU están diseñadas principalmente para funcionar con palabras de 32 y 64 bits. Pero en realidad, el "interruptor" de dos estados es la razón por la cual todos los números de computadora tienden a ser potencias de 2.
Razones históricas, supongo. 8 es una potencia de 2, 2 ^ 2 es 4 y 2 ^ 4 = 16 es muy poco para la mayoría de los propósitos, y 16 (la siguiente potencia de dos) el hardware de bit vino mucho más tarde.
Pero la razón principal, sospecho, es el hecho de que tenían microprocesadores de 8 bits, luego microprocesadores de 16 bits, cuyas palabras podrían muy bien representarse como 2 octetos, y así sucesivamente. Ya sabes, crucero histórico y compatibilidad hacia atrás, etc.
Otra razón, igualmente pragmática, contra la "reducción": si, por ejemplo, usáramos 4 bits como una palabra, básicamente obtendríamos solo la mitad de la tasa de rendimiento en comparación con 8 bits. Aparte de desbordar mucho más rápido.
Siempre puede apretar, por ejemplo, 2 números en el rango de 0..15 en un octeto ... solo tiene que extraerlos a mano. Pero a menos que tengas, como, millones de conjuntos de datos para mantener en la memoria de lado a lado, esto no vale la pena.