viernes, 2 de julio de 2021

Megabits, Megabytes y Mebibytes

En informática se utilizan varios tipos de unidades de medida y algunas veces no se indica claramente cual de ellas se está utilizando. Esto puede llevar a confusión en muchas ocasiones y hacer que cometamos errores de cálculo. En este artículo voy a hacer un pequeño repaso de las unidades utilizadas para diferentes propósitos y los problemas más comunes que se presentan.

La unidad mínima de información usada en informática es el bit. El bit puede representar dos valores: 0 o 1, verdadero o falso, si o no, activado o desactivado, etc. Para representar otro tipo de informacion se debe utilizar un grupo de bits. Desde los años 50 a un grupo de bits se le ha dado el nombre de byte. Dependiendo del sistema informático un byte podía contener más o menos bits. En las siguientes décadas en varios sistemas se popularizó el uso de bytes de 8 bits y desde hace muchos años se entiende que un byte son 8 bits y así está definido en el estándar ISO IEC 80000-13. En las unidades de medida para diferenciar entre bits y bytes se suele utilizar la letra "b" minúscula para bits y la letra "B" mayúscula para bytes. En algunas ocasiones, para evitar confusiones, se escriben las palabras "bits" o "bytes" completas.

El valor de muchas cosas en informática es potencia de 2. Por ejemplo el procesador Zilog Z80 tiene un bus de datos de 8 bits y un bus de direcciones de 16 bits. Para saber cuantas direcciones distintas se pueden indicar con 16 bits hay que calcular cuantas combinaciones distintas puede haber en 16 dígitos binarios. Esto se consigue elevando 2 a 16, lo que da como resultado 65536. Como el bus de datos es de 8 bits = 1 byte el procesador puede acceder a 65536 bytes de memoria.

Para hacer más fácil la utilización de números grandes se suelen usar múltiplos. En lugar de bytes se quiso utilizar kilobytes. Para pasar 65536 bytes a kilobytes habría que dividir entre 1000 y nos quedaría 65,536 KB. Esta cifra con decimales no es muy fácil de manejar así que se optó por lo más lógico, dividir entre una potencia de 2 cercana a 1000, osea 210 = 1024. Dividiendo 65536 bytes entre 1024 el resultado es el número entero 64, mucho más fácil de manejar. Este mismo método se aplicó al resto de múltiplos como megabytes y gigabytes.

Ese sistema es muy útil pero el problema surge cuando también hay que medir cosas que su valor no es potencia de 2 y dividir entre 1024 no ofrece ninguna ventaja. Por ejemplo la capacidad de los discos duros depende de la cantidad de sectores que tengan y no es potencia de 2. El disco duro de mi ordenador tiene 240.057.409.536 bytes y dividido entre 1.000.000.000 el resultado es 240.057. Como está muy cerca de 240 se redondea y se dice que el disco duro es de 240 GB.

# smartctl -i /dev/sda

User Capacity:    240.057.409.536 bytes [240 GB]

Ahora tenemos unos kilobytes, megabytes y gigabytes que son múltiplos de 1000 y otros que son múltiplos de 1024. Claramente no son lo mismo, no es la misma unidad, no se pueden hacer calculos entre ellos y deberían tener nombres distintos. Para solucionar este problema y evitar confusiones se crearon las unidades binarias kibibyte (KiB), mebibyte (MiB), gibibyte (GiB) y siguientes.

Desafortunadamente el uso de estas unidades no está muy extendido y es común que se usen las unidades decimales para múltiplos de 1000 y 1024. Por ejemplo una aplicación nos puede decir que el tamaño de un archivo es 12 MB (12.000.000 / 1000 / 1000) y otra 11,44 MB (12.000.000 / 1024 / 1024).

Por último en algunos casos como en la transferencia de información se suelen usar múltiplos decimales del bit como kilobit (Kb), megabit (Mb) o gigabit (Gb). Es muy fácil confundir por ejemplo Mb (megabit) con MB (megabyte) si confundimos la "b" minúscula con la "B" mayúscula.

Antes de la creación de las unidades binarias algunos programas para evitar equivocaciones indicaban el tipo de megabytes que estaban utilizando. Por ejemplo el programa FDISK de particionado de discos de MS-DOS indicaba la cantidad de bytes a los que equivalían los megabytes usados por el programa. También usaba en la unidad la palabra completa "byte", lo que evita la confusión con bits.

Total disk space is 59 Mbytes (1 Mbyte = 1048576 bytes)

El comando hdparm muestra el tamaño del disco duro en megabytes de 1024*1024 bytes y en megabytes de 1000*1000 bytes. También usa en la unidad la palabra completa "Bytes".

# hdparm -I /dev/sda

    device size with M = 1024*1024:      228936 MBytes
    device size with M = 1000*1000:      240057 MBytes (240 GB)

En la historia de la informática un caso muy curioso de confusión entre unidades es el de los disquetes de 1440 KiB. Se comercializaban como de "1,44 MB" pero los cálculos no salen. Si dividimos el número de bytes dos veces entre 1024 para hallar los mebibytes nos salen 1,40625 MiB. Si lo dividimos dos veces entre 1000 para hallar los megabytes nos sale 1,474559 MB. Ni usando unidades decimales o binarias el resultado se acerca a 1,44 MB.

La única forma de llegar a 1,44 MB es dividir entre 1024 y luego entre 1000 o viceversa mezclando unidades decimales y binarias, lo que no tiene ningún sentido. Supongo que se dividió el numero de bytes entre 1024 para sacar el número de KiB (1474560 bytes / 1024 = 1440 KiB) y a partir de ese número se sacó erróneamente el 1,44 dividiendo entre 1000.

Espero contribuir un poco con este artículo a extender el uso de las unidades binarias para evitar confusiones. Yo en los artículos de este blog intento siempre usarlas cuando corresponde, aunque es muy fácil cometer errores.

No hay comentarios:

Publicar un comentario