En informática, la signatura es una propiedad de los tipos de datos que representan números en programas informáticos. Una variable numérica tiene signo si puede representar tanto números positivos como negativos , y no tiene signo si solo puede representar números no negativos (cero o números positivos).
Como los números con signo pueden representar números negativos, pierden un rango de números positivos que solo se pueden representar con números sin signo del mismo tamaño (en bits) porque aproximadamente la mitad de los valores posibles son valores no positivos, mientras que el tipo sin signo respectivo puede dedicar todos los valores posibles al rango de números positivos.
Por ejemplo, un entero de 16 bits con signo en complemento a dos puede contener los valores de −32768 a 32767 inclusive, mientras que un entero de 16 bits sin signo puede contener los valores de 0 a 65535. Para este método de representación de signos , el bit más a la izquierda ( bit más significativo ) indica si el valor es negativo (0 para positivo o cero, 1 para negativo).
En la mayoría de las arquitecturas, no existe una distinción entre tipos con signo y sin signo en el lenguaje de máquina . Sin embargo, las instrucciones aritméticas suelen establecer diferentes indicadores de CPU , como el indicador de acarreo para la aritmética sin signo y el indicador de desbordamiento para la aritmética con signo. Esos valores se pueden tener en cuenta en los comandos aritméticos o de bifurcación posteriores.
El lenguaje de programación C , junto con sus derivados, implementa un signado para todos los tipos de datos enteros , así como para "character" . Para los enteros, el modificador unsigned define el tipo que no tiene signo. El signado predeterminado de los enteros fuera de los campos de bits es con signo, pero se puede establecer explícitamente con el modificador signed . Por el contrario, el estándar C declara signed char , unsigned char y char 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 que signed char o unsigned char , pero la elección de cuál depende de la plataforma. Los literales enteros se pueden convertir en unsigned con el sufijo U.
Los compiladores suelen emitir una advertencia cuando se realizan comparaciones entre números con signo y sin signo o cuando se convierte uno en otro. Se trata de operaciones potencialmente peligrosas, ya que los rangos de los tipos con signo y sin signo son diferentes.
Pedazos | Mínimo | Máximo |
---|---|---|
8 (firmado) | −128 | 127 |
16 (firmado) | −32768 | 32767 |
32 (firmado) | −2147483648 | 2147483647 |
64 (firmado) | −9223372036854775808 | 9223372036854775807 |
128 (firmado) | −170141183460469231731687303715884105728 | 170141183460469231731687303715884105727 |
8 (sin firmar) | 0 | 255 |
16 (sin firmar) | 0 | 65535 |
32 (sin firmar) | 0 | 4294967295 |
64 (sin firmar) | 0 | 18446744073709551615 |
128 (sin firmar) | 0 | 340282366920938463463374607431768211455 |