Pregunta

He visto estos se menciona en el contexto de C y C++, pero ¿cuál es la diferencia entre con y sin signo de las variables?

¿Fue útil?

Solución

Firmado variables, tales como enteros se permiten representar números, tanto en los aspectos positivos y negativos rangos.

Unsigned variables, tales como enteros sin signo, se sólo permiten representar números en positivo.

Sin firmar y firmados variables del mismo tipo (tales como int y byte) ambos tienen el mismo rango (rango de 65.536 y 256 números, respectivamente), pero sin signo puede representar una magnitud más grande que la correspondiente variable firmada.

Por ejemplo, un unsigned byte puede representar valores de 0 a 255, mientras que signed byte puede representar -128 a 127.

Página de la Wikipedia en Firmado número de representaciones explica la diferencia en la representación en el nivel de bit, y el Entero (ciencias de la computación) la página proporciona una tabla de rangos para cada firmado/tipo de entero sin signo.

Otros consejos

Aunque comúnmente se conoce como un 'bit de signo', los valores binarios que usualmente usamos no tienen un bit de signo verdadero.

La mayoría de las computadoras usan aritmética de complemento a dos. Los números negativos se crean tomando el complemento de uno (voltea todos los bits) y agregando uno:

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 5 (decimal) -> 00000101 (binary)
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 1's complement: 11111010
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; add 1: 11111011 which is 'FB' in hex


Es por eso que un byte firmado contiene valores de -128 a +127 en lugar de -127 a +127:

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 1 0 0 0 0 0 0 0 = -128
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 1 0 0 0 0 0 0 1 = -127
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; - - -
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 1 1 1 1 1 1 1 0 = -2
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 1 1 1 1 1 1 1 1 = -1
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0 0 0 0 0 0 0 0 = 0
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0 0 0 0 0 0 0 1 = 1
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0 0 0 0 0 0 1 0 = 2
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; - - -
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0 1 1 1 1 1 1 0 = 126
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0 1 1 1 1 1 1 1 = 127
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; (agregar 1 a 127 da :) :) & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 1 0 0 0 0 0 0 0 & nbsp; & nbsp; & nbsp; que nosotros ver en la parte superior de este cuadro es -128.


Si tuviéramos un bit de signo adecuado, 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:

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; -5 (decimal) -> 10000101 (binary)
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 0 (decimal) -> 00000000 (binary)

Lo interesante en este caso es que tenemos un cero y un cero negativo:
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; -0 (decimal) -> 10000000 (binary)
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; <=>


No tenemos -0 con complemento a dos; lo que sería -0 es -128 (o para ser más general, uno más que el mayor valor positivo). Sin embargo, hacemos con el complemento de uno; los 1 bits son 0 negativos.

Matemáticamente, -0 es igual a 0. Recuerdo vagamente una computadora donde -0 < 0, pero no puedo encontrar ninguna referencia a él ahora.

Las variables con signo usan un bit para marcar si son positivas o negativas. Las variables sin signo no tienen este bit, por lo que pueden almacenar números más grandes en el mismo espacio, pero solo números no negativos, p. 0 y superior.

Para más información: Enteros sin firmar y firmados

Las variables sin signo 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.

Las variables firmadas pueden ser 0, positivas o negativas.

Las variables sin signo pueden ser 0 o positivas.

Algunas veces se usan variables sin signo porque se pueden usar más bits para representar el valor real. Dándote un mayor rango. También puede asegurarse de que no se pasará un valor negativo a su función, por ejemplo.

unsigned se usa cuando su valor debe ser positivo, no hay valor negativo aquí, si está firmado para el rango int -32768 a +32767 si no está firmado para el rango int 0 a 65535

Las variables sin signo son variables que se representan internamente sin un signo matemático (más o menos) solo puede almacenar 'cero' o valores positivos . Digamos que la variable sin signo tiene un tamaño de n bits , entonces puede representar 2 ^ n (2 potencia n) valores - 0 a (2 ^ n -1). Una variable con signo, por otro lado, 'pierde' un bit por 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 .

P.S .:
Internamente, el signo matemático puede representarse en la forma del complemento de uno, en la forma del complemento de dos o con un bit de signo (por ejemplo: 0 - & Gt; +, 1 - & Gt; -)
Todos estos métodos dividen efectivamente el rango de valores representables en n bits (2 ^ n) en tres partes, positivo, negativo y cero.

Esto es solo el valor de mis dos centavos.

Espero que esto ayude.

Puede que esta no sea la definición exacta, pero te daré un ejemplo: Si tuviera que crear un número aleatorio tomándolo de la hora del sistema, aquí usar la variable sin signo es beneficioso ya que existe un amplio margen para los números aleatorios ya que los números con signo dan números positivos y negativos. Como el tiempo del sistema no puede ser negativo, usamos una variable sin signo (solo números positivos) y tenemos un rango más amplio de números aleatorios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top