Pourquoi la plage de n'importe quel type de données est plus grande du côté négatif par rapport au côté positif?
Par exemple, en cas d'entier:
Dans Turbo C sa plage est -32768
à 32767
et pour Visual Studio c'est -2147483648
à 2147483647
.
Il en va de même pour les autres types de données ...
[UPD: définir des valeurs limites appropriées pour Visual Studio]
En raison de la façon dont les numéros sont stockés. Les nombres signés sont stockés en utilisant quelque chose appelé "notation du complément à deux".
N'oubliez pas que toutes les variables ont une certaine quantité de bits. Si le plus significatif d'entre eux, celui de gauche, est un 0, alors le nombre est non négatif (c'est-à-dire positif ou nul), et le reste des bits représente simplement la valeur.
Cependant, si le bit le plus à gauche est un 1, le nombre est négatif. La valeur réelle du nombre peut être obtenue en soustrayant 2 ^ n du nombre entier représenté (comme une quantité non signée, y compris le 1 le plus à gauche), où n est la quantité de bits de la variable.
Comme il ne reste que n - 1 bits pour la valeur réelle (la "mantisse") du nombre, les combinaisons possibles sont 2 ^ (n - 1). Pour les nombres positifs/nuls, c'est facile: ils vont de 0 à 2 ^ (n - 1) - 1. C'est -1 pour expliquer zéro lui-même - par exemple, si vous n'aviez que quatre combinaisons possibles, ces combinaisons représenterait 0, 1, 2 et 3 (remarquez qu'il y a quatre nombres): il va de 0 à 4 - 1.
Pour les nombres négatifs, rappelez-vous que le bit le plus à gauche est 1, donc le nombre entier représenté va entre 2 ^ (n - 1) et (2 ^ n) - 1 (les parenthèses sont très importantes ici!). Cependant, comme je l'ai dit, vous devez retirer 2 ^ n pour obtenir la valeur réelle du nombre. 2 ^ (n - 1) - 2 ^ n est - (2 ^ (n - 1)), et ((2 ^ n) - 1) - 2 ^ n est -1. Par conséquent, la plage des nombres négatifs est comprise entre - (2 ^ (n - 1)) et -1.
Mettez tout cela ensemble et vous obtenez -2 ^ (n - 1) à 2 ^ (n - 1) - 1. Comme vous pouvez le voir, la borne supérieure obtient un -1 que la borne inférieure n'a pas.
Et c'est pourquoi il y a un nombre négatif de plus que positif.
La plage minimale requise par C est en fait de -32767 à 32767, car elle doit prendre en charge le complément à deux, le complément à un et le codage signe/amplitude pour les nombres négatifs, ce que permet la norme C. Voir Annex E, Implementation limits
de C11 (et C99) pour plus de détails sur les plages minimales pour les types de données.
Votre question ne concerne que la variante du complément à deux et la raison en est simple. Avec 16 bits, vous pouvez représenter 216 (ou 65 536) différentes valeurs et zéro doit être l'une d'entre elles. Il reste donc un nombre impair de valeurs, dont la majorité (par un) sont des valeurs négatives:
1 thru 32767 = 37267 values
0 = 1 value
-1 thru -32768 = 32768 values
-----
65536 values
Le codage de complément et de signe-amplitude des deux permet une valeur zéro négative (ainsi que zéro positif), ce qui signifie qu'un modèle de bits de moins est disponible pour les nombres non nuls, d'où la plage minimale réduite que vous trouvez dans la norme .
1 thru 32767 = 37267 values
0 = 1 value
-0 = 1 value
-1 thru -32767 = 32767 values
-----
65536 values
Le complément à deux est en fait un schéma de codage astucieux car les nombres positifs et négatifs peuvent être ajoutés avec le même matériel simple. D'autres schémas d'encodage nécessitent généralement un matériel plus élaboré pour effectuer la même tâche.
Pour une explication plus complète sur le fonctionnement du complément à deux, voir page wikipedia .
Parce que la plage comprend zéro. Le nombre de valeurs différentes qu'un entier sur n bits peut représenter est 2 ^ n. Cela signifie qu'un entier 16 bits peut représenter 65536 valeurs différentes. S'il s'agit d'un entier 16 bits non signé, il peut représenter 0-65535 (inclus). La convention pour les entiers signés est de représenter -32768 à 32767, -214748368 à 214748367, etc.
Avec un complément à 2, les nombres négatifs sont définis comme le bit à bit non plus 1, ce qui réduit la plage de nombres possibles dans un nombre donné de bits de 1 du côté négatif.
Normalement, en raison de l'utilisation d'un système de complément à deux pour stocker les valeurs négatives, lorsque vous retournez le bit de signe sur un entier, il est biaisé vers le négatif.
La plage doit être: - (2 ^ (n-1)) - ((2 ^ (n-1) -1)