language agnostic - ¿Cuál es la diferencia entre las variables firmadas y las no firmadas?
language-agnostic unsigned (8)
He visto estos mencionados en el contexto de C y C ++, pero ¿cuál es la diferencia entre las variables firmadas y las no firmadas?
Aunque comúnmente se conoce como ''bit de signo'', los valores binarios que usamos habitualmente no tienen un bit de signo verdadero.
La mayoría de las computadoras usan aritmética de dos complementos. Los números negativos se crean tomando el complemento de uno (volteando todos los bits) y agregando uno:
5 (decimal) -> 00000101 (binary)
1''s complement: 11111010
add 1: 11111011 which is ''FB'' in hex
Esta es la razón por la que un byte firmado contiene valores de -128 a +127 en lugar de -127 a +127:
1 0 0 0 0 0 0 0 = -128
1 0 0 0 0 0 0 1 = -127
- - -
1 1 1 1 1 1 1 0 = -2
1 1 1 1 1 1 1 1 = -1
0 0 0 0 0 0 0 0 = 0
0 0 0 0 0 0 0 1 = 1
0 0 0 0 0 0 1 0 = 2
- - -
0 1 1 1 1 1 1 0 = 126
0 1 1 1 1 1 1 1 = 127
(agregue 1 a 127 da :)
1 0 0 0 0 0 0 0
que vemos en la parte superior de esta tabla es -128.
Si tuviéramos un bit de signo apropiado, el rango de valores sería el mismo (por ejemplo, -127 a +127) porque un bit está reservado para el signo. Si el bit más significativo es el bit de signo, tendríamos:
5 (decimal) -> 00000101 (binary)
-5 (decimal) -> 10000101 (binary)
Lo interesante en este caso es que tenemos un cero y un cero negativo:
0 (decimal) -> 00000000 (binary)
-0 (decimal) -> 10000000 (binary)
No tenemos -0 con complemento de dos; lo que sería -0 es -128 (o para ser más general, uno más que el valor positivo más grande). Sin embargo, lo hacemos con el complemento; todos los 1 bits son negativos 0.
Matemáticamente, -0 es igual a 0. Recuerdo vagamente una computadora donde -0 <0, pero no puedo encontrar ninguna referencia a ella ahora.
Las variables firmadas usan un bit para marcar si son positivas o negativas. Las variables sin firmar no tienen este bit, por lo que pueden almacenar números más grandes en el mismo espacio, pero solo números no negativos, por ejemplo, 0 y más.
Para más: enteros sin signo y firmados
Las variables sin firmar solo pueden ser números positivos, porque carecen de la capacidad de indicar que son negativas.
Esta habilidad se llama ''signo'' o ''bit de firma''.
Un efecto secundario es que sin un bit de firma, tienen un bit más que se puede usar para representar el número, duplicando el número máximo que puede representar.
Puede que esta no sea la definición exacta pero le daré un ejemplo: si creara un número aleatorio tomándolo de la hora del sistema, aquí usar la variable sin signo es beneficioso, ya que hay un amplio margen para números aleatorios a medida que los números firmados dan ambos números positivos y negativos. Como el tiempo del sistema no puede ser negativo, utilizamos una variable sin signo (solo números positivos) y tenemos un mayor rango de números aleatorios.
unsigned se usa cuando el valor de ur debe ser positivo, sin valor negativo aquí, si se firmó para rango int -32768 a +32767 si no está firmado para rango int 0 a 65535
Las variables firmadas , como los enteros con signo, le permitirán representar números tanto en los rangos positivo como negativo .
Las variables sin firmar , como los enteros sin signo, solo le permitirán representar los números en el positivo .
Las variables sin signo y con signo del mismo tipo (como int
y byte
) tienen el mismo rango (rango de 65.536 y 256 números, respectivamente), pero sin signo puede representar un número de magnitud mayor que la variable con signo correspondiente .
Por ejemplo, un unsigned byte
puede representar valores de 0
a 255
, mientras que el signed byte
puede representar -128
a 127
.
La página de Wikipedia sobre representaciones de números firmados explica la diferencia en la representación en el nivel de bits, y la página Entero (ciencias de la computación) proporciona una tabla de rangos para cada tipo de entero con signo / sin signo.
Las variables firmadas pueden ser 0, positivas o negativas.
Las variables sin firmar pueden ser 0 o positivas.
Las variables sin firmar se usan a veces porque se pueden usar más bits para representar el valor real. Te da un rango más grande. También puede asegurarse de que no se pase un valor negativo a su función, por ejemplo.
Las variables sin firmar son variables que están representadas internamente sin un signo matemático (más o menos) pueden almacenar valores ''cero'' o positivos solamente . Digamos que la variable sin signo tiene un tamaño n bits , entonces puede representar valores de 2 ^ n (2 potencia n) - 0 a (2 ^ n -1). Una variable con signo, por otro lado, ''pierde'' un bit para representar el signo, por lo que puede almacenar valores desde - (2 ^ (n-1) -1) hasta (2 ^ (n-1)) incluyendo cero. Por lo tanto, una variable con signo puede almacenar valores positivos, valores negativos y cero .
PD:
Internamente, el signo matemático puede representarse en forma de complemento, en forma de complemento a dos o con un bit de signo (p. Ej .: 0 -> +, 1-> -)
Todos estos métodos dividen efectivamente el rango de valores representables en n bits (2 ^ n) en tres partes, positivo, negativo y cero.
Este es solo mi valor de dos centavos.
Espero que esto ayude.