2009-03-07 22 views
48

he visto estos mencionados en el contexto de C y C++, pero ¿cuál es la diferencia entre las variables con y sin signo?¿Cuál es la diferencia entre las variables firmadas y las no firmadas?

+0

Pensé que asumimos en la programación por defecto y no cuando está etiquetado no relacionado con la programación? –

+0

Yo también. Encontré muchas preguntas bajo programación. ¿Me pregunto porque? – batbrat

+0

La pregunta se refiere a un aspecto específico de la programación en general. – Sam152

Respuesta

102

las variables firmados, tales como enteros con signo se permitirá representar números tanto en los rangos positivos y negativos.

las variables sin signo, tales como enteros sin signo, se sólo le permiten representar números positivos en el.

las variables sin firmar y firmados 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 pueden representar un número magnitud mayor que el correspondiente firmado variable de .

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

página de Wikipedia sobre Signed number representations explica la diferencia en la representación a nivel de bits, y la página Integer (computer science) proporciona una tabla de rangos para cada tipo entero con signo/sin signo.

+0

Los números positivos son mayores que cero. Los números firmados, al menos en C, pueden usar un bit de signo en lugar de una representación de complemento, por lo que no tienen el mismo rango que los no firmados debido a que se repite +/- cero. Si dice que un int es de 16 bits, diga la plataforma; la mayoría de los sistemas modernos son de 32 o 64 bits. –

18

Las variables con signo utilizan 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, p. 0 y más.

Para más: Unsigned and Signed Integers

+0

s/positivo/no negativo/ – Ken

+0

Sí, reparado para que quede más claro. –

+0

gracias, después de 2 minutos de búsqueda en google, esta fue mi respuesta favorita para aclararme – SheldonH

3

Las variables sin firmar solo pueden ser números positivos, porque carecen de la capacidad de indicar que son negativos.

Esta capacidad se denomina '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.

3

Las variables con signo pueden ser 0, positivas o negativas.

Las variables sin signo pueden ser 0 o positivas.

Las variables sin firmar se utilizan 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.

variables de
0

sin firmar son las variables que están representados el interior sin un signo matemático (más o menos) puede almacenar 'cero' o valores positivos sólo. Digamos la variable sin signo es n bits de en tamaño, entonces se puede representar valores de 2^n (2) de 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.

PS:
Internamente, el signo matemático puede ser representado en la propia forma de complemento, forma de complemento a dos o con un bit de signo (por ejemplo: 0 -> +, 1-> -)
Todos estos métodos efectivamente divide el rango de valores representables en n bits (2^n) en tres partes, positivo, negativo y cero.

Esto es sólo mi valor de dos centavos.

Espero que esto ayude.

2

sin signo se utiliza cuando ur valor debe ser positivo, no tiene valor negativo aquí, si firmó para el rango de -32768 a +32767 int si no firmado para el rango de 0 a 65535 int

37

Mientras que comúnmente se conoce como un " bit de signo ', los valores binarios que solemos usar 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 mediante la adopción de la one's-complemento (voltear todos los bits) y la adición de uno:

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


Esta es la razón por un byte con signo contiene valores -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
            (añadir de 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 más significativo bit es el bit de signo, tendríamos:

            5 (decimal) -> 00000101 (binary)
            -5 (decimal) -> 10000101 (binary)

Lo interesante en este caso es que tenemos tanto un cero como un cero negativo:
            0 (decimal) -> 00000000 (binary)
            -0 (decimal) -> 10000000 (binary)


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 valor positivo más grande). Sin embargo, lo hacemos con el complemento; todos los bits 1 es negativo 0.

Matemáticamente, -0 es igual a 0. Recuerdo vagamente un equipo en el -0 < 0, pero no puedo encontrar ninguna referencia a ella ahora.

+3

¡Muchas gracias! Estaba realmente confundido por qué es -128 a 127 para un byte firmado y no -127 a 127. ¡Esta respuesta necesita más votos! –

-1

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 el azar los números como números con signo dan 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.

Cuestiones relacionadas