La Confusion dans les 16 bits de données de type plage
En 16 Bits compilateur C nous avons 2 octets pour stocker un entier, et 1 octet par caractère. Pour les entiers non signés sur la plage est de 0 à 65535. Pour les entiers signés de la gamme est de -32768 à 32767. Non signés, de caractère, de 0 à 255. Selon le type entier, ne devrait pas signé la gamme de caractères être comme -128 à 127. Mais pourquoi -127 à 127? Quel est le reste un peu?
Vous devez vous connecter pour publier un commentaire.
Je pense que vous avez le mélange de deux choses:
signed char
,int
etc.Ci ne doit pas nécessairement être la même aussi longtemps que la gamme de mise en œuvre est un sur-ensemble de la gamme requise par la norme.
Selon le C standard, la mise en œuvre des valeurs définies par des
SCHAR_MIN
etSCHAR_MAX
doit être égale ou de plus grande ampleur (valeur absolue), et de même signe que:c'est à dire de 255 valeurs, pas 256.
Cependant, les limites définies par la conformité de la mise en œuvre peut être "grand" ampleur que ces. c'est à dire
[-128,+127]
est autorisé par la norme de trop. Et puisque la plupart des machines de représenter des nombres dans le 2 forme de complément,[-128,+127]
est la gamme que vous aurez à voir plus souvent.En fait, même le minimum de
int
défini par la norme C est symétrique sur zéro. Il est:c'est à dire seulement 65535 valeurs, pas 65536.
Mais encore une fois, la plupart des machines à utiliser Complément de 2 représentation, et cela signifie qu'ils offrent la gamme
[-32768,+32767]
.Tandis que dans 2 forme de complément il est possible de représenter 256 valeurs signées en 8 bits (c'est à dire
[-128,+127]
), il y a d'autres signé nombre de représentations où cela n'est pas possible.Dans le signe de l'ampleur de la représentation, un bit est réservé pour le signer, alors:
les deux signifient la même chose, c'est à dire
0
(ou plutôt,+0
et-0
).Cela signifie d'une valeur de est gaspillée. Et donc signe de magnitude représentation ne peut contenir que des valeurs de -127 (
11111111
) à +127 (01111111
) en 8 bits.Dans le un complément représentation (négation en faisant not au niveau du bit):
les deux signifient la même chose, c'est à dire
0
.Encore une fois, seules les valeurs de -127 (
10000000
) à +127 (01111111
) peuvent être représentés sur 8 bits.Si C est la norme requise de la gamme à être
[-128,+127]
, alors cela aurait pour effet d'exclure les machines à l'aide de ces représentations d'être en mesure d'exécuter efficacement les programmes en C. Ils nécessitent un bit supplémentaire pour représenter cette gamme, donc besoin de 9 bits pour stocker signé caractères au lieu de 8. La conclusion logique basé sur la ci-dessus: C'est pourquoi la norme exige[-127,+127]
pour la signature de caractères. c'est à dire pour permettre des implémentations de la liberté de choisir une forme de représentation entière qui répond à leurs besoins et en même temps être en mesure de se conformer à la norme d'une manière efficace. La même logique s'applique àint
ainsi.