¿Por qué utilizamos prefijos binarios únicos (k = 2 ^ 10) al medir bytes y no los prefijos habituales con los que todos estamos familiarizados (k = 1000)?

Cuando ejecuta un programa en una CPU, accede a la memoria cargando valores de la memoria en los registros de la CPU, realizando operaciones en ellos y escribiendo valores de registro en la memoria. A nivel de hardware, la memoria es direccionable por bytes, lo que significa que la unidad de almacenamiento más pequeña es un byte. Puede pensar en la memoria como una tabla de bytes, con direcciones que comienzan de 0 a N-1, donde N es el tamaño de la memoria en bytes.

La RAM es típicamente un conjunto de chips separados de la CPU. Hay un conjunto de pines en el chip de memoria llamado “dirección” y otro conjunto de pines llamados “datos”. Cada uno de estos pines corresponde a un bit: lleva un alto voltaje o un bajo voltaje, con uno correspondiente al binario “1” y el otro al binario “0”. Así que efectivamente, la dirección (así como los valores de datos) se representan como un número binario.

Entonces, si tiene, por ejemplo, 20 pines de dirección, representan un número binario de 20 bits, cuyo valor puede variar de todos ceros (dirección = 0x0) a todos (dirección = 0xfffff o 2 ^ 20-1) . Por lo tanto, puede abordar 2 ^ 20 bytes. La suposición más simple es que cada una de esas direcciones es válida y corresponde a un byte almacenado en la memoria.

Si tuviera que restringir el tamaño de la memoria a un número redondo decimal (digamos 1000000), entonces las direcciones más allá de eso, 1000000 a 1048575, serán direccionables utilizando los pines, pero no válidos para el acceso. Esto requeriría una lógica adicional en el chip de memoria para detectar y rechazar. Además, el controlador de memoria (lógica que se encuentra entre la CPU y la memoria, y que con frecuencia maneja múltiples chips de memoria) también necesitaría una lógica más complicada para asignar direcciones a los chips de memoria correctos. Esto agrega costo y complejidad sin ningún beneficio real.

Es por eso que las direcciones de memoria tienden a ser números binarios redondos en lugar de números decimales redondos.

Una excepción a esta convención es el almacenamiento, en particular los discos duros. Dado que los discos duros son mucho, mucho más lentos que la memoria, pueden permitirse una lógica de cálculo de direcciones bastante compleja, con el resultado de que los tamaños de los discos duros generalmente no son números redondos binarios. Sin embargo, en lugar de decir mil millones de bytes o un billón de bytes, los proveedores tienden a usar gigabytes o terabytes, lo cual es confuso porque un disco duro de terabyte tiene menos bytes que un terabyte de RAM.

Se trata de contexto. Cuando se refiere a los bytes de memoria, normalmente se entiende por un uso común que 1kB es 1024 bytes. Cuando se trata de masa, se entiende que 1 kg son 1000 gramos. Estas son convenciones: respételas y no debería ser confuso en absoluto.

La razón, por lo que vale, es que el tamaño de la memoria está relacionado con el espacio de direcciones de la computadora por potencias de dos. Una palabra de 16 bits puede abordar ubicaciones de 2 ^ 16 o 65536, pero dado que es una forma incómoda de expresarla y sabemos que 65536 = 64 * 1024, la llamamos 64k.

Debido a que es bastante incómodo tener que recordar que 1 Mbyte = 1048576 bytes (o algunas veces 1024000 bytes), que 1 Gbyte = 1073741824 bytes, etc.