Bytes en memoria: orden, tipos y direcciones

La memoria almacena bytes, uno en cada dirección. Los números que ocupan más de un byte se reparten entre varias direcciones. La instrucción de lectura determina qué bytes forman un mismo número, en qué orden se interpretan y de qué tipo es ese número. Elige una lectura: se iluminarán los bytes que utiliza y verás el valor posicional por el que se multiplica cada uno.

Cargando simulación interactiva...

Lección

La teoría — Bytes en memoria: orden, tipos y direcciones

Un byte consta de ocho bits y representa un valor de 0 a 255. Cada dirección de memoria almacena uno. Un número que ocupa varios bytes utiliza direcciones consecutivas: cuatro para un entero de 32 bits. El orden de los bytes determina cómo se disponen. En little-endian, el byte menos significativo ocupa la dirección más baja; en big-endian, la ocupa el más significativo. Al interpretar cuatro bytes como entero sin signo, su valor es b₀·256⁰ + b₁·256¹ + b₂·256² + b₃·256³, donde bₖ es el byte que ocupa la posición k. Si la lectura es con signo, se resta 2³² cuando esa suma es igual o superior a 2³¹. Una lectura en coma flotante interpreta los mismos bits según la norma IEEE 754.

Qué significa cada símbolo

bₖ
el byte en la posición k, de 0 (la menos significativa) a 3
256ᵏ
su valor posicional: 1, 256, 65.536 o 16.777.216
Supone
Los enteros con signo usan complemento a dos y los números en coma flotante siguen el formato de precisión simple de IEEE 754, como en todos los procesadores actuales de ordenadores y teléfonos. El texto usa ASCII, con un byte por carácter; UTF-8, que hoy utiliza la mayoría de los archivos, puede necesitar hasta cuatro bytes para un solo carácter.

Al invertir el orden de lectura de los bytes, 1 se convierte en 16.777.216 🖖

Pulsa 1 al revés. Un procesador x86, al igual que los ARM tal como se usan en los teléfonos, guarda el 1 como entero de 32 bits con el 01 en la dirección más baja y tres bytes de valor cero a continuación. Es el orden little-endian: primero el byte menos significativo. Al leer en orden big-endian, el primer byte se interpreta como el más significativo, de modo que ese mismo 01 vale 256³ y el número es 16.777.216. Los bytes siguen siendo los mismos. De los 4.294.967.296 valores posibles de 32 bits, solo los 65.536 cuyo primer byte coincide con el cuarto y cuyo segundo coincide con el tercero dan el mismo resultado en ambos órdenes. −1, FF FF FF FF, es uno de ellos. Danny Cohen dio nombre a los dos órdenes en 1980, inspirado por la guerra de Los viajes de Gulliver sobre por qué extremo había que cascar un huevo cocido.

π y 1.078.530.011 corresponden a los mismos cuatro bytes 🖖

Pulsa π como entero. Al guardar π como número en coma flotante de 32 bits, se redondea al valor representable más cercano, 3,14159274, y ocupa los cuatro bytes DB 0F 49 40. Si los lees como entero con signo, obtienes 1.078.530.011; al cambiar el orden de los bytes, −619.755.200. Como texto, contienen dos caracteres, I y @, y dos bytes no imprimibles. Ningún byte indica que el valor esté en coma flotante. El Little Man Computer no podía distinguir una instrucción de un número. Tampoco una memoria de bytes distingue entre tipos de números: el tipo lo determina la instrucción que los lee. Por eso, un programa que usa un tipo incorrecto puede obtener un resultado erróneo sin que se produzca ningún error de ejecución.

Dos números positivos dan uno negativo al leer desde la dirección siguiente 🖖

Pulsa Una dirección más. 1.000 está en la dirección 0 y 2.000 en la dirección 4, ambos en orden little-endian: E8 03 00 00 D0 07 00 00. Una lectura de 32 bits que empieza en la dirección 1 en vez de la 0 toma 03 00 00 del primer número y D0 del segundo. D0 ocupa entonces la posición más significativa: 3 + 208 × 256³ = 3.489.660.931. Al interpretarlo como entero con signo, el resultado es −805.306.365, porque el bit más significativo de D0 está activado. En el resultado no aparece ninguno de los números almacenados, y nada en la memoria señalaba dónde terminaba cada uno.

Problema resuelto al detalle

  1. ¿Qué tamaño tiene esta imagen? 4 pasos

    Pulsa Cabecera PNG. Son los primeros 24 bytes de un archivo PNG. La especificación de PNG establece que todos los enteros que ocupen más de un byte se guardan en orden big-endian y que el bloque IHDR comienza con la anchura seguida de la altura, con cuatro bytes para cada una. Encuentra la anchura y la altura, y calcula qué dimensiones obtendría un programa que las leyera en orden little-endian.

    Abre este problema en la herramienta

    1. El archivo empieza con una firma de ocho bytes: 89 50 4E 47 0D 0A 1A 0A. Los cuatro bytes siguientes indican la longitud del primer bloque en orden big-endian: 00 00 00 0D vale 13. Después viene el tipo de bloque, 49 48 44 52, que como texto es IHDR. Por tanto, los datos del bloque empiezan en la dirección 16.

    2. Anchura, direcciones de 16 a 19: 00 00 01 E0. En orden big-endian, el 01 ocupa la posición de valor 256¹ y E0, que vale 224, la de valor 256⁰: 256 + 224 = 480. La lectura de la herramienta en la dirección 16 muestra ese mismo resultado.

    3. Altura, direcciones de 20 a 23: 00 00 01 0E, cuyo valor es 256 + 14 = 270.

    4. En orden little-endian, el último byte pasa a ser el más significativo. La anchura sería 224 × 256³ + 1 × 256² = 3.758.161.920 y la altura, 14 × 256³ + 256² = 234.946.560.

    Respuesta

    480 × 270 píxeles. Leídos en orden little-endian, los mismos bytes indican 3.758.161.920 × 234.946.560, unos 8,83 × 10¹⁷ píxeles. A cuatro bytes por píxel, son 3,53 × 10¹⁸ bytes. El archivo no indica el orden de los bytes: lo establece la especificación, y el programa necesita esa información para leerlo.

Ruta de aprendizaje

Cómo ejecuta un programa un ordenador

Referencias (2)