¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Guardar números y texto en bits

Después de esta lección: Puedo guardar números y texto como bits.

Lección de 55 min11 comandosLaboratorio de compiladores y arquitectura: gcc, flex, bison y RISC-V en una VM

El aparcamiento con 255 plazas libres

El aparcamiento de un centro comercial tiene un letrero con las plazas libres. Un sensor cuenta los coches que entran y salen.

Una noche el sensor cuenta una salida de más cuando el letrero ya marcaba 0. Ahora el letrero dice 255. Nada está roto. El programa guardó -1 en ocho bits, y el letrero leyó esos bits como un número normal.

Al final de esta lección

Nota

Puedo guardar números y texto como bits.

Palabras clave

PalabraQué significaEjemplo
Bituna cifra binaria: 0 o 1
Byteocho bits, la unidad con que se cuenta la memoria
Binarioescribir números solo con las cifras 0 y 100101101
Hexadecimalbase 16, una cifra por cada cuatro bits0xac
Complemento a dosla forma habitual de guardar enteros negativos en bits
Código de carácterel número que representa una letra o un signo78 para la N

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

El binario cuenta de dos en dos

En los números de siempre, cada posición vale diez veces más que la de su derecha. En binario, cada posición vale el doble.

Un byte tiene ocho posiciones, que valen 128, 64, 32, 16, 8, 4, 2 y 1. Para leer un byte, suma las posiciones que tienen un 1. Así, 00101101 es 32 + 8 + 4 + 1, es decir, 45.

Ejemplo resuelto: 45 en un byte

Valor de la posición1286432168421
Bit00101101
Suma003208401

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Entra en la carpeta de arquitectura

Comando
cd ~/arch

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Pide a Python tres conversiones

Comando
python3 -c "print(bin(45), hex(172), int('101101', 2))"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

La terminal también escribe hexadecimal

Comando
printf '%d %x\n' 172 172

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Una cifra hexadecimal son cuatro bits

El sistema hexadecimal tiene dieciséis cifras: de 0 a 9 y después de a a f, que valen de diez a quince. Cada cifra equivale justo a cuatro bits.

Por eso un byte ocupa siempre dos cifras hexadecimales. 172 es 1010 1100 en bits: una a y una c, que se escribe 0xac. Las herramientas que muestran la memoria usan hexadecimal porque es corto y encaja con los bits.

Los negativos usan el bit de arriba

Un byte no tiene signo menos. El complemento a dos hace que el bit de arriba valga -128 en lugar de 128. Los otros siete bits valen lo de siempre.

Así, 11111111 es -128 + 127, o sea, -1. Para escribir un negativo, súmale 256 y escribe el resultado como un byte normal. Por ejemplo, -4 pasa a ser 252, que es 11111100.

Ejemplo resuelto: un byte leído de dos formas

BitsLeído sin signoLeído en complemento a dos
0000100199
01111111127127
10000000128-128
11111100252-4
11111111255-1

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Escribe un programa RISC-V que resta

Comando
printf '.globl _start\n_start:\n  li a0, 5\n  li a1, 9\n  sub a0, a0, a1\n  li a7, 93\n  ecall\n' > resta.s

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Ensámblalo

Comando
riscv64-linux-gnu-as resta.s -o resta.o

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Enlázalo

Comando
riscv64-linux-gnu-ld resta.o -o resta

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Ejecútalo en el emulador

Comando
qemu-riscv64 ./resta

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Lee el estado de salida

Comando
echo $?

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error frecuente

Advertencia

Mucha gente cree que los bits dicen por sí solos si un número es negativo. No es así. El programa calculó 5 - 9 y dejó -4 en a0. Linux se quedó con los ocho bits de abajo, 11111100, y la terminal los leyó sin signo: 252. Los mismos bits valen -4 o 252 según quién los lea.

El texto también son números

El ordenador guarda cada letra como su código de carácter. La N es 78 y la n es 110. Los primeros 128 códigos son iguales en todos los sistemas habituales.

UTF-8 guarda esos 128 en un byte cada uno. Los demás caracteres ocupan de dos a cuatro bytes. La ñ es el código 241, y UTF-8 la guarda como los bytes c3 b1. Por eso "año" ocupa cuatro bytes aunque tenga tres letras.

Códigos de carácter y bytes de UTF-8

Comando
python3 -c "print(chr(241).encode('utf-8'), ord('N'), ord('n'))"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Los decimales se guardan aproximados

Un número con decimales como 0,1 se guarda en coma flotante: un signo, una potencia de dos y una fracción, 64 bits en total. Casi ninguna fracción decimal se puede escribir exacta con potencias de dos. Pasa lo mismo con un tercio escrito en decimal.

Por eso 0,1 + 0,7 queda muy cerca de 0,8, pero no es 0,8. Nunca compares importes en euros con == en coma flotante.

Suma 0,1 y 0,7

Comando
python3 -c "print(0.1 + 0.7)"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Los bytes de 2026, el menor primero

Comando
python3 -c "print((2026).to_bytes(4, 'little').hex(' '))"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Para ir más lejos: ampliar un número

Escribe -12 en 8 bits a mano. Después escríbelo en 16 bits. Compara los dos: ¿qué ha pasado con los ocho bits nuevos de la izquierda?

Comprueba los dos resultados con tu función encode. Luego explica qué debe hacer el procesador cuando carga un byte con signo en un registro de 64 bits.

Sobre este laboratorio y su código: Laboratorio de compiladores y arquitectura: gcc, flex, bison y RISC-V en una VM

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.