El vídeo que rompió un contador
En 2014, un vídeo musical de YouTube superó las 2.147.483.647 visitas. YouTube tuvo que cambiar cómo guardaba el contador.
Ese número es el mayor que cabe en 32 bits cuando también hay que guardar negativos. La lección pasada, un byte iba de 0 a 255, sin signo menos y sin coma. Hoy ves cómo se guardan los negativos y los decimales.
Al terminar esta lección
Nota
Puedo guardar números negativos y números con decimales.
Palabras clave
| Palabra | Qué significa |
|---|---|
| Complemento a dos | la forma habitual de guardar enteros negativos en bits |
| Bit más significativo | el bit de la izquierda, el que más vale |
| Desbordamiento | un resultado demasiado grande para los bits que lo guardan |
| Coma fija | un número con la coma siempre en el mismo sitio |
| Coma flotante | un número guardado como cifras y una potencia que mueve la coma |
| Error de redondeo | una pequeña diferencia porque un valor no se guarda exacto |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Antes de empezar
Nota
Pulsa Iniciar el laboratorio en la barra superior y espera a que la máquina diga que está en marcha. Cada botón Ejecutar escribe su comando en el terminal de la máquina, uno detrás de otro.
El bit de arriba cuenta en negativo
En complemento a dos, el bit de la izquierda de un byte vale -128 en vez de 128. Los otros siete bits valen lo de siempre.
Así, un byte que empieza por 0 es cero o positivo. Un byte que empieza por 1 es negativo. Ahora un byte guarda de -128 a 127: siguen siendo 256 números distintos.
Ejemplo resuelto: un byte leído de dos formas
| Bits | Leído de 0 a 255 | Leído en complemento a dos | Cómo se suma |
|---|---|---|---|
| 00000101 | 5 | 5 | 4 + 1 |
| 01111111 | 127 | 127 | 64 + 32 + 16 + 8 + 4 + 2 + 1 |
| 10000000 | 128 | -128 | -128 |
| 11111101 | 253 | -3 | -128 + 64 + 32 + 16 + 8 + 4 + 1 |
| 11111111 | 255 | -1 | -128 + 127 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Invierte los bits y suma uno
Hay un truco rápido para escribir un negativo. Escribe el número positivo con ocho bits. Invierte todos los bits: cada 0 pasa a 1 y cada 1 pasa a 0. Después suma uno.
Los mismos pasos convierten un negativo otra vez en su positivo.
Ejemplo resuelto: escribir -3
| Paso | Bits |
|---|---|
| Escribe 3 | 00000011 |
| Invierte cada bit | 11111100 |
| Suma uno | 11111101 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Entra en la carpeta arch
cd ~/archSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe un programa de C que devuelve -3
printf 'int main(void) { return -3; }\n' > menos.cSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Compílalo
gcc menos.c -o menosSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecútalo
./menosSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Pregunta a la terminal qué devolvió
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 lo dicen. El programa devolvió -3 como los bits 11111101. La terminal lee esos bits de 0 a 255, así que escribió 253. Los mismos bits son -3 o 253 según quién los lea.
La coma fija no mueve la coma
Con el dinero es fácil equivocarse. Muchas tiendas guardan los precios en céntimos: 12,50 € pasa a ser 1250. Así todas las cuentas son con enteros, que son exactos.
El binario puede hacer lo mismo. Elige un sitio para la coma. Las posiciones de detrás valen un medio, un cuarto, un octavo, y así sigue.
Ejemplo resuelto: 5,75 en coma fija
| Valor posicional | 8 | 4 | 2 | 1 | , | 1/2 | 1/4 | 1/8 | 1/16 |
|---|---|---|---|---|---|---|---|---|---|
| Bit | 0 | 1 | 0 | 1 | , | 1 | 1 | 0 | 0 |
| Vale | 0 | 4 | 0 | 1 | , | 1/2 | 1/4 | 0 | 0 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
La coma flotante mueve la coma
La coma fija no puede guardar a la vez un número enorme y uno diminuto. La coma flotante guarda las cifras y una potencia por separado, como 5,75 escrito 0,575 × 10.
La mayoría de los decimales, como 0,1, no tienen una forma binaria exacta. Se guardan muy cerca, pero no exactos.
Suma 0,1 y 0,2
python3 -c "print(0.1 + 0.2)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Pregunta si da justo 0,3
python3 -c "print(0.1 + 0.2 == 0.3)"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: dieciséis bits
Un juego guarda la puntuación en 16 bits de complemento a dos. ¿Cuál es la puntuación más alta que puede guardar? ¿Y la más baja?
Usa la misma idea que con el byte: el bit de arriba vale lo de siempre, pero en negativo. Después di qué pasa si la puntuación más alta gana un punto más.