web-dev-qa-db-fra.com

Quelle est la différence entre les variables signées et non signées?

J'ai vu ceux-ci mentionnés dans le contexte de C et C++, mais quelle est la différence entre les variables signées et non signées?

61
Sam152

Les variables signées , telles que les entiers signés vous permettront de représenter des nombres dans les plages positives et négatives.

Les variables non signées , telles que les entiers non signés, vous permettront seulement de représenter des nombres dans le positif.

Les variables non signées et signées du même type (telles que int et byte) ont toutes deux la même plage (plage de 65 536 et 256 nombres, respectivement), mais unsigned peut représenter un nombre de magnitude supérieur à la variable signée correspondante .

Par exemple, un unsigned byte peut représenter des valeurs de 0 à 255, tandis que signed byte peut représenter -128 à 127.

La page Wikipedia sur Représentations des nombres signés explique la différence de représentation au niveau des bits, et la page Entier (informatique) fournit un tableau des plages pour chaque entier signé/non signé type.

119
coobird

Bien qu'elles soient communément appelées "bit de signe", les valeurs binaires que nous utilisons habituellement n'ont pas de vrai bit de signe.

La plupart des ordinateurs utilisent l'arithmétique du complément à deux. Les nombres négatifs sont créés en prenant le complément à un (retournez tous les bits) et en ajoutant un:

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


C'est pourquoi un octet signé contient des valeurs de -128 à +127 au lieu de -127 à +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
(Ajouter 1 à 127 donne :)
1 0 0 0 0 0 0 0 Que nous voyons en haut de ce graphique est -128.


Si nous avions un bit de signe approprié, la plage de valeurs serait la même (par exemple, -127 à +127) car un bit est réservé pour le signe. Si le bit le plus significatif est le bit de signe, nous aurions:

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

La chose intéressante dans ce cas est que nous avons à la fois un zéro et un zéro négatif:
0 (decimal) -> 00000000 (binary)
-0 (decimal) -> 10000000 (binary)


Nous n'avons pas -0 avec complément à deux; ce qui serait -0 est -128 (ou pour être plus général, un de plus que la plus grande valeur positive). Nous faisons cependant avec son complément; tous les 1 bits sont négatifs 0.

Mathématiquement, -0 est égal à 0. Je me souviens vaguement d'un ordinateur où -0 <0, mais je ne trouve aucune référence à lui maintenant.

41
Alan Jay Weiner

Les variables signées utilisent un bit pour indiquer si elles sont positives ou négatives. Les variables non signées n'ont pas ce bit, elles peuvent donc stocker de plus grands nombres dans le même espace, mais uniquement des nombres non négatifs, par ex. 0 et plus.

Pour en savoir plus: Entiers non signés et signés

18
Chris Hynes

variables signées peut être 0, positif ou négatif.

variables non signées peut être 0 ou positif.

Des variables non signées sont parfois utilisées car davantage de bits peuvent être utilisés pour représenter la valeur réelle. Vous offrant une gamme plus large. Vous pouvez également vous assurer qu'une valeur négative ne sera pas transmise à votre fonction par exemple.

3
Brian R. Bondy

Les variables non signées ne peuvent être que des nombres positifs, car elles n'ont pas la capacité d'indiquer qu'elles sont négatives.

Cette capacité est appelée "signe" ou "bit de signature".

Un effet secondaire est que sans bit de signature, ils ont un bit de plus qui peut être utilisé pour représenter le nombre, doublant le nombre maximum qu'il peut représenter.

3
thomasrutter

unsigned est utilisé lorsque la valeur ur doit être positive, aucune valeur négative ici, si signé pour la plage int -32768 à +32767 si non signé pour la plage int 0 à 65535

2
manish modi

Variables non signées sont des variables qui sont représentées en interne sans signe mathématique (plus ou moins) peut stocker 'zéro' ou des valeurs positives uniquement. Disons que la variable non signée a une taille de n bits, alors elle peut représenter 2 ^ n (2 puissances n) - 0 à (2 ^ n -1). Une variable signée, d'autre part, "perd" un bit pour représenter le signe, de sorte qu'elle peut stocker des valeurs de 2 ^ (n-1) -1) à (2 ^ (n-1)), y compris zéro. Ainsi, une --- (variable signée peut stocker valeurs positives, valeurs négatives et zéro.

P.S.:
En interne, le signe mathématique peut être représenté sous forme de complément à un, de complément à deux ou avec un bit de signe (par exemple: 0 -> +, 1-> -)
Toutes ces méthodes divisent efficacement la plage de valeurs représentables en n bits (2 ^ n) en trois parties, positive, négative et nulle.

C'est juste ma valeur de deux cents.

J'espère que ça aide.

0
batbrat