¿Cuál es la diferencia entre las variables con y sin signo?


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

Author: user694733, 2009-03-07

8 answers

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

Las variables sin signo , como los enteros sin signo, solo le permitirán representar 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 mayor número de magnitud que la correspondiente variable con signo .

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

La página de Wikipedia en Representaciones de números firmadosexplica la diferencia en la representación a nivel de bits, y la página Entero (informática) proporciona una tabla de rangos para cada tipo entero firmado/sin firmar.

 110
Author: coobird,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-07 18:16:39

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 de dos. Los números negativos se crean tomando el complemento de uno (voltear 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 con signo tiene 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
      (añadir 1 a 127 da:)
      1 0 0 0 0 0 0 0 que vemos en la parte superior de este gráfico 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:

      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 dos-complemento; lo que sería -0 es -128 (o para ser más general, uno más que el mayor valor positivo). Sin embargo, lo hacemos con el complemento de uno; todos los 1 bits son 0 negativos.

Matemáticamente, -0 es igual a 0. Recuerdo vagamente una computadora donde -0

 39
Author: Alan Jay Weiner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-03 08:37:19

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, por ejemplo, 0 y superiores.

Para más: Enteros sin Signo y con Signo

 18
Author: Chris Hynes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-07 18:10:12

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

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.

 3
Author: thomasrutter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-07 04:15:55

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

Las variables sin signo pueden ser 0 o positivas.

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

 3
Author: Brian R. Bondy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-07 04:54:13

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

 2
Author: manish modi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-15 17:52:58

Las variables sin signo son variables que se representan internamente sin un signo matemático (más o menos) pueden almacenar 'cero' o valores positivos solo. Digamos que la variable sin signo es n bits de tamaño, entonces puede representar 2^n (2 power n) valores - 0 hasta (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. Así, una variable con signo puede almacenar valores positivos, valores negativos y cero.

P.d.:
Internamente, el signo matemático puede representarse en la forma de complemento de uno, en la forma de complemento de dos o con un bit de signo (por ejemplo: 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.

Esto es sólo mi valor de dos centavos.

Espero que esto ayude.

 0
Author: batbrat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-07 04:58:13

Esta puede no ser la definición exacta, pero te daré un ejemplo: Si creara un número aleatorio tomándolo del tiempo del sistema, aquí usar la variable sin signo es beneficioso ya que hay un gran alcance 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.

 -1
Author: Udaya Vikas Kudulla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-22 11:12:10