Pourquoi la plage d'int est -32768 à 32767?
Pourquoi la gamme de tout type de données est plus grande sur le côté négatif que de les comparer à côté positif?
Par exemple, dans le cas d'un entier:
Dans Turbo C sa gamme est -32768
à 32767
et pour Visual Studio il est -2147483648
à 2147483647
.
Il arrive la même chose à d'autres types de données...
[UPD: Définir des valeurs limites pour Visual Studio]
source d'informationauteur VJain
Vous devez vous connecter pour publier un commentaire.
En raison de la façon dont les nombres sont stockés. Nombres signés sont stockées à l'aide de quelque chose appelé "complément à deux de la notation".
Rappelez-vous que toutes les variables ont une certaine quantité de bits. Si le plus important d'entre eux, l'un sur la gauche, est 0, alors le nombre est non-négative (positive ou nulle), et le reste des bits représentent simplement la valeur.
Toutefois, si la gauche est 1, alors le nombre est négatif. La valeur réelle du numéro peut être obtenu par la soustraction de 2^n à partir du nombre entier représenté (comme un unsigned quantité, y compris la plus à gauche 1), où n est la quantité de bits de la variable a.
Puisque seuls les n - 1 bits sont à gauche de la valeur réelle (la "mantisse") le nombre, les combinaisons possibles sont 2^(n - 1). Pour le positif/aucun numéro, c'est facile: ils vont de 0 à 2^(n - 1) - 1. Que -1 est de rendre compte de zéro lui-même-par exemple, si vous n'avez eu que quatre combinaisons possibles, ces combinaisons représentent 0, 1, 2, et 3 (notez qu'il y a quatre numéros): elle passe de 0 à 4 - 1.
Pour les nombres négatifs, rappelez-vous le plus à gauche bit est à 1, de sorte que le nombre représenté passe entre les 2^(n - 1) et (2^n) - 1 (les parenthèses sont très important!). Cependant, comme je l'ai dit, vous devez prendre 2^n pour obtenir la valeur réelle du nombre. 2^(n - 1) - 2^n -(2^(n - 1)) et ((2^n) - 1) - 2^n est -1. Par conséquent, les nombres négatifs gamme est -(2^(n - 1)) -1.
Mettre tout cela ensemble et vous obtenez -2^(n - 1) 2^(n - 1) - 1. Comme vous pouvez le voir, la limite supérieure obtient un -1 que la limite inférieure n'est pas.
Et c'est pourquoi il y a un nombre négatif que le positif.
Le minimum requis par la C est en fait -32767 à 32767, car il a pour accueillir en complément à deux, les compléter et signer/l'importance de l'encodage pour les nombres négatifs, ce qui le C standard permet. Voir
Annex E, Implementation limits
de C11 (et C99) pour plus de détails sur le minimum de plages pour les types de données.Votre question concerne uniquement le complément à deux de la variante et la raison en est simple. Avec 16 bits, vous pouvez représenter la 216 (ou 65 536) des valeurs différentes de zéro doit être l'un de ceux-ci. Il y a donc un nombre impair de valeurs de gauche, dont la majorité (par un) sont des valeurs négatives:
À la fois un " complément de signe et l'ampleur de l'encodage de permettre un négatif, une valeur différente de zéro (ainsi que de positif de zéro), ce qui signifie que moins un motif de bits est disponible pour les non-zéro nombres, d'où la réduction de la distance minimale que vous trouverez dans la norme.
En complément à deux est en fait un astucieux système de codage parce que les nombres positifs et négatifs peuvent être ajoutées, ensemble, avec le même matériel. D'autres systèmes de codage ont tendance à exiger plus élaboré du matériel pour faire la même tâche.
Pour une explication plus complète sur la façon dont complément à deux ouvrages, voir la page wikipedia.
Avec 2s de compléter les nombres négatifs sont définis comme la not au niveau du bit de plus de 1 cela réduit la gamme des chiffres dans un nombre donné de bits par 1 sur le côté négatif.
Parce que la gamme comprend zéro. Le nombre de valeurs différentes de n bits entier peut représenter est 2^n. Que signifie un entier 16 bits peut représenter 65536 valeurs différentes. Si c'est un entier non signé entier 16 bits, on peut représenter 0-65535 (inclus). La convention pour les entiers signés est de représenter -32768 à 32767, -214748368 à 214748367, etc.
Habituellement, en raison de l'utilisation d'un complément à deux système pour stocker des valeurs négatives, lorsque vous retournez le bit de signe sur un entier c'est biaisée vers le négatif.
La plage doit être: -(2^(n-1)) - ((2^(n-1)-1)