¿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 negativos y con decimales

Después de esta lección: Puedo guardar números negativos y números con decimales.

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

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

PalabraQué significa
Complemento a dosla forma habitual de guardar enteros negativos en bits
Bit más significativoel bit de la izquierda, el que más vale
Desbordamientoun resultado demasiado grande para los bits que lo guardan
Coma fijaun número con la coma siempre en el mismo sitio
Coma flotanteun número guardado como cifras y una potencia que mueve la coma
Error de redondeouna 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

BitsLeído de 0 a 255Leído en complemento a dosCómo se suma
00000101554 + 1
0111111112712764 + 32 + 16 + 8 + 4 + 2 + 1
10000000128-128-128
11111101253-3-128 + 64 + 32 + 16 + 8 + 4 + 1
11111111255-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

PasoBits
Escribe 300000011
Invierte cada bit11111100
Suma uno11111101

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

Entra en la carpeta arch

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.

Escribe un programa de C que devuelve -3

Comando
printf 'int main(void) { return -3; }\n' > menos.c

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

Compílalo

Comando
gcc menos.c -o menos

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

Comando
./menos

Se 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ó

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 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 posicional8421,1/21/41/81/16
Bit0101,1100
Vale0401,1/21/400

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

Comando
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

Comando
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.

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.