Quelle est la différence entre unsigned int et signé int en C?
Tenir compte de ces définitions:
int x=5;
int y=-5;
unsigned int z=5;
Comment sont-ils stockés dans la mémoire? Quelqu'un peut-il expliquer le peu de représentation de ceux-ci dans la mémoire?
Peut int x=5
et int y=-5
ont la même représentation binaire dans la mémoire?
Vous devez vous connecter pour publier un commentaire.
ISO C indique quelles sont les différences.
La
int
type de données est signé et a une distance minimale d'au moins -32767 à 32767 inclusive. Les valeurs réelles sont donnés danslimits.h
commeINT_MIN
etINT_MAX
respectivement.Un
unsigned int
a un minimum de gamme de 0 à 65535 inclusif avec la réelle valeur maximale étantUINT_MAX
à partir de ce même fichier d'en-tête.Au-delà, la norme n'impose pas la notation en complément à deux de codage des valeurs, c'est juste une des possibilités. Les trois types autorisés aurait codages suivants pour 5 et -5 (à l'aide de 16 bits de données les types):
Noter que les valeurs positives avoir le même encodage pour toutes les représentations, seules les valeurs négatives sont différents.
Note en outre que, pour des valeurs non signées, vous n'avez pas besoin d'utiliser l'un des bits pour un signe. Cela signifie que vous obtenez plus de portée sur le côté positif, au prix de rien de négatif à encodages, bien sûr).
Et non,
5
et-5
ne peut pas avoir le même encodage indépendamment de la représentation que vous utilisez. Sinon, il n'y aurait aucun moyen de faire la différence.La C standard indique que les nombres non signés seront stockés en binaire. (En option avec rembourrage bits). Nombres signés peuvent être stockés dans l'un des trois formats: Ampleur et le signe; en complément à deux ou complément. Il est intéressant de noter que les règles de certaines autres représentations comme L'excès de n ou de la Base de -2.
Cependant, sur la plupart des machines et des compilateurs de stocker des nombres signés en complément de 2.
int
est normalement de 16 ou 32 bits. La norme dit queint
devrait être tout ce qui est le plus efficace pour le processeur sous-jacente, tant qu'il est>= short
et<= long
alors il est autorisé par la norme.Sur certaines machines et OSs histoire a cause
int
de ne pas être la meilleure taille pour l'itération courante de matériel cependant.int
est en aucune manière le type qui est le plus efficace pour le processeur. Dans la plupart des cas, il est aujourd'hui coincé avec 32 bits (seulement pour des raisons de syntaxe qu'autre chose), où il est le plus souvent efficace est de 64.int
à 32 bits.) Et je pense que Douglas phrasethe C standard doesn't specify how integers are stored in memory
ne peux pas rester comme ça. Le standard a plusieurs pages à le préciser. E. g, elle déclare qu'il y a seulement trois représentations de signe que vous mentionnez, et pas d'autres.<stdint.h>
offre un sens conforme à définir d'autres types d'entiers (comme, 24 ou 36 bits).Voici le très beau lien qui explique le stockage des entiers signés et non signés INT en C -
http://answers.yahoo.com/question/index?qid=20090516032239AAzcX1O
Prises à partir de cet article ci-dessus -
"processus appelé en complément à deux est utilisé pour transformer des nombres positifs, négatifs et les nombres. L'inconvénient, c'est que le bit le plus significatif est utilisé pour indiquer à l'ordinateur si le nombre est positif ou négatif. Si le bit le plus significatif à 1, alors le nombre est négatif. Si c'est 0, le nombre est positif."
Parce que c'est tout simplement de la mémoire, à la fin, toutes les valeurs numériques sont stockés en binaire.
De 32 bits non signés peuvent contenir des valeurs de tous les binaires de 0 à tous les binaires 1s.
Quand il s'agit de entier signé de 32 bits, cela signifie que l'un de ses bits (le plus important) est un drapeau, qui marque la valeur positive ou négative.
En supposant que l'int est un 16 bits entier (qui dépend de l'implémentation C, la plupart sont en 32 bits à nos jours) la représentation binaire varie comme suit:
si binaire 1111111111111011 devrait être fixé à un unsigned int, il serait décimal 65531.