Signo (computación)
# Signo (computación)

En computación, el signo o asignación (en inglés, signedness) es una propiedad de los tipos de datos que representan números en programas computacionales. Una variable numérica está signada (asignada; en inglés signed) si puede representar tanto números positivos como negativos, y no signada (o desasignada, en inglés unsigned) si únicamente puede representar números no negativos (cero o números positivos).

Ya que los números signados pueden representar valores positivos y negativos, pierden un rango con respecto a los números desasignados del mismo tamaño (en bits), debido a que aproximadamente la mitad de los valores posibles son no positivos, mientras que el respectivo tipo desasignado puede dedicar todos los posibles valores al rango de números positivos.

Por ejemplo, un entero de 16-bit en un complemento a dos signado puede contener los valores -32768 a 32767 inclusive, mientras que un entero de 16-bit no signado puede contener los valores de 0 a 65535. Por este método de representación de signo, el bit más a la izquierda (bit más significante) denota si el valor es positivo o negativo (0 para positivo y 1 para negativo).

## En lenguajes de programación

Para la mayoría de las arquitecturas, no existe una distinción del tipo signado o no signado en código máquina. Sin embargo, las instrucciones de aritmética usualmente establecen diferentes flags en el procesador, como la C flag (carry flag) para aritmética no signada y la V flag (overflow flag) para la signada. Estos valores pueden tomarse en cuenta por subsecuentes saltos o comandos aritméticos.

El lenguaje de programación C, junto a sus derivados, dispone de la propiedad de signo para todos los tipos de dato enteros, al igual que para los "caracteres". Para enteros, el modificador unsigned define el tipo como no signado. El tipo predeterminado de un entero es signado, pero puede ser establecida explícitamente con el modificador signed. Por contraste, los estándares de C declaran signed char (carácter signado), unsigned char (carácter no signado), y char (carácter), como tres tipos distintos, pero especifica que los tres deben tener el mismo tamaño y alineación. Además, char debe tener el mismo rango numérico, ya sea signed char o unsigned char, pero la elección de cual depende de la plataforma. Los enteros literales pueden asignarse como no signados con el sufijo U. Por ejemplo, 0xFFFFFFFF devuelve -1, pero 0xFFFFFFFFU devuelve 4,294,967,295 para código de 32-bits.

Los compiladores normalmente muestran una advertencia cuando se hacen comparaciones entre números signados y no signados, o cuando uno es convertido al otro. Estas son operaciones potencialmente problemáticas, ya que los rangos de los tipos signados y no signados son diferentes.

