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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Bit | una cifra binaria: 0 o 1 | |
| Byte | ocho bits, la unidad con que se cuenta la memoria | |
| Binario | escribir números solo con las cifras 0 y 1 | 00101101 |
| Hexadecimal | base 16, una cifra por cada cuatro bits | 0xac |
| Complemento a dos | la forma habitual de guardar enteros negativos en bits | |
| Código de carácter | el número que representa una letra o un signo | 78 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ón | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|---|
| Bit | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 |
| Suma | 0 | 0 | 32 | 0 | 8 | 4 | 0 | 1 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Entra en la carpeta de arquitectura
cd ~/archSe 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
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
printf '%d %x\n' 172 172Se 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
| Bits | Leído sin signo | Leído en complemento a dos |
|---|---|---|
| 00001001 | 9 | 9 |
| 01111111 | 127 | 127 |
| 10000000 | 128 | -128 |
| 11111100 | 252 | -4 |
| 11111111 | 255 | -1 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Escribe un programa RISC-V que resta
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.sSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ensámblalo
riscv64-linux-gnu-as resta.s -o resta.oSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Enlázalo
riscv64-linux-gnu-ld resta.o -o restaSe 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
qemu-riscv64 ./restaSe 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
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
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
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
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.