Question

Je les ai vus mentionnés dans le contexte de C et C ++, mais quelle est la différence entre les variables signées et non signées?

Était-ce utile?

La solution

Les variables signées , telles que les entiers signés , vous permettent de représenter des nombres dans les plages positive et négative .

Les variables non signées , telles que les entiers non signés, ne vous permettront que de représenter des nombres positifs .

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

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

La page Wikipedia sur la Représentations des nombres signés explique la différence entre les représentations au niveau du bit et la page Integer (informatique) fournit un tableau d'intervalles pour chaque entier signé / non signé. type.

Autres conseils

Bien que communément appelé un "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 à deux complémentaires. Les nombres négatifs sont créés en prenant le complément à un (retourner tous les bits) et en ajoutant un:

& 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


C’est pourquoi un octet signé contient des valeurs allant de -128 à +127 au lieu de -127 à +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; & 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; & 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; (ajoutez 1 à 127 donne :)

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 1 0 0 0 0 0 0 0 & nbsp; & nbsp; & nbsp; voyez en haut de ce tableau 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é au signe. Si le bit le plus significatif est le bit de signe, nous aurions:

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

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


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 avec son complément cependant; 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 à cela maintenant.

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 des nombres plus grands dans le même espace, mais uniquement des nombres non négatifs, par exemple. 0 et plus.

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

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

Cette capacité s'appelle le "signe" ou "bit de signature".

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

Les variables signées peuvent être 0, positives ou négatives.

Les variables non signées peuvent être égales à 0 ou positives.

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

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

Les

variables non signées sont des variables représentées de manière interne sans signe mathématique (plus ou moins) ne peut stocker que des valeurs "zéro" ou positives . Supposons que la variable non signée ait une taille n bits , elle peut alors représenter 2 ^ n (2 puissances n) - 0 à (2 ^ n -1). Une variable signée, par contre, "perd" un bit pour représenter le signe, afin de pouvoir stocker les valeurs de - (2 ^ (n-1) -1) à (2 ^ (n-1)), y compris zéro. Ainsi, une variable signée peut stocker des valeurs positives, des valeurs négatives et zéro .

P.S.:
En interne, le signe mathématique peut être représenté sous forme de complément, sous forme de complément à deux ou avec un bit de signe (par exemple: 0 - & Gt; +, 1 - & Gt; -)
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.

Ceci ne représente que mes deux cents.

J'espère que cela vous aidera.

Ce n'est peut-être pas la définition exacte, mais je vais vous donner un exemple: Si vous deviez créer un nombre aléatoire en le prenant à partir de l'heure système, l'utilisation de la variable non signée est avantageuse car il existe une grande marge pour les nombres aléatoires car les nombres signés donnent des nombres positifs et négatifs. Comme l'heure du système ne peut pas être négative, nous utilisons une variable non signée (uniquement des nombres positifs) et la plage de nombres aléatoires est plus étendue.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top