En el sistema binario, los números enteros pueden ser representados tanto de manera signed (con signo) como unsigned (sin signo). La diferencia es que
- Unsigned: Los números son únicamente positivos
- Signed: Los números son positivos o negativos
Esto es algo que confunde mucho al principio. Pero recordemos que una cosa es un número, y otra cosa es la representación de un número. Así que,
11001000
Es la representación de un número en binario. El número “real” es
200
, si considero que es un 8bits unsigned-56
, si considero que es un 8bits signed
¡Menuda diferencia! Pero el tema es aún peor, porque también influye la longitud del número. Si pasamos a 16 bits.
00000000 11001000
Ese número,
200
si considero que es un 16bits unsigned200
si considero que es un 16bits signed
¿Por qué? Porque aún tengo muchos ceros a la izquierda para llegar a los números negativos. Para que fuera -56 en 16 bits tendría que ser
11111111 11001000
Ese número es
32740
si considero que es un 16bits unsigned-56
si considero que es un 16bits signed
Signed y unsigned
Signed (con signo)
En la representación signed, el bit más significativo (el bit más a la izquierda) se utiliza para indicar el signo del número. Un bit de 0 indica un número positivo, mientras que un bit de 1 indica un número negativo.
Por ejemplo, si estamos trabajando con un byte (8 bits), el rango de números enteros signed es de -128 a 127. El bit más a la izquierda es el bit de signo, por lo que solo hay 7 bits disponibles para representar el valor absoluto del número.
Unsigned (sin signo)
En la representación unsigned, todos los bits se utilizan para representar el valor absoluto del número. No hay un bit dedicado al signo, por lo que todos los números son considerados positivos.
Por ejemplo, en un byte (8 bits), el rango de números enteros unsigned es de 0 a 255. Todos los bits están disponibles para representar el valor absoluto del número.
Rangos y Cantidad de Bytes
Como decíamos, la cantidad de bytes y si son signed o unsigned, impacta directamente en el rango de valores que podemos almacenar y en el número que estamos representando.
Aquí hay una tabla que resume los rangos y la cantidad de bytes comúnmente utilizados en la representación de números enteros:
Signed / Unsigned | Nº de Bytes | Rango |
---|---|---|
Unsigned | 1 byte | 0 a 255 |
Unsigned | 2 bytes | 0 a 65,535 |
Unsigned | 4 bytes | 0 a 4,294,967,295 |
Signed | 1 byte | -128 a 127 |
Signed | 2 bytes | -32,768 a 32,767 |
Signed | 4 bytes | -2,147,483,648 a 2,147,483,647 |
Rango extendido para números negativos
Es importante mencionar que el rango de números negativos suele tener un valor más negativo que positivo por un motivo, que los positivos incluyen el cero.
En la representación signed, el cero se incluye en el rango positivo, lo que significa que el rango negativo necesita incluir un número adicional para compensar.
Por ejemplo, en un byte, el rango signed es de -128 a 127, donde -128 es un número más negativo que -127. Esto se debe a que el cero se encuentra en el rango positivo