Quelle est la différence entre unsigned int et signed int en C?

Considérez ces définitions:

int x=5; int y=-5; unsigned int z=5; 

Comment sont-ils stockés en mémoire? Quelqu’un peut-il expliquer la représentation de bits de ceux-ci dans la mémoire?

int x=5 et int y=-5 peuvent-ils avoir la même représentation de bit en mémoire?

ISO C indique quelles sont les différences.

Le type de données int est signé et a une plage minimale d’au moins -32767 à 32767 inclus. Les valeurs réelles sont indiquées dans limits.h sous les INT_MIN et INT_MAX respectivement.

Un unsigned int a une plage minimale de 0 à 65535 inclus, la valeur maximale réelle étant UINT_MAX partir du même fichier d’en-tête.

Au-delà de cela, la norme ne requirejs pas la notation du complément à deux pour coder les valeurs, ce n’est qu’une des possibilités. Les trois types autorisés auraient les codages suivants pour 5 et -5 (en utilisant des types de données 16 bits):

  two's complement | ones' complement | sign/magnitude +---------------------+---------------------+---------------------+ 5 | 0000 0000 0000 0101 | 0000 0000 0000 0101 | 0000 0000 0000 0101 | -5 | 1111 1111 1111 1011 | 1111 1111 1111 1010 | 1000 0000 0000 0101 | +---------------------+---------------------+---------------------+ 
  • En complément à deux, vous obtenez un négatif d’un nombre en inversant tous les bits, puis en ajoutant 1.
  • Dans le complément de chacun, vous obtenez un négatif d’un nombre en inversant tous les bits.
  • En signe / magnitude, le bit le plus haut est le signe, vous devez simplement l’inverser pour obtenir le négatif.

Notez que les valeurs positives ont le même encodage pour toutes les représentations, seules les valeurs négatives sont différentes.

Notez en outre que, pour les 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 distance du côté positif (au prix de l’absence d’encodage négatif, bien sûr).

Et non, 5 et -5 ne peuvent pas avoir le même encodage, quelle que soit la représentation que vous utilisez. Sinon, il n’y aurait aucun moyen de faire la différence.

La norme C spécifie que les nombres non signés seront stockés en binary. (Avec des bits de remplissage en option). Les numéros signés peuvent être stockés dans l’un des trois formats suivants: Magnitude et signe; complément à deux ou son complément. Fait intéressant, cela exclut certaines autres représentations comme Excess-n ou Base −2 .

Cependant, sur la plupart des machines et des compilateurs, les nombres signés sont stockés en complément de 2.

int est normalement 16 ou 32 bits. La norme dit que int devrait être ce qui est le plus efficace pour le processeur sous-jacent, tant que c’est >= short et <= long alors cela est autorisé par la norme.

Sur certaines machines et certains systèmes d’exploitation, l’historique n’a toutefois pas la taille idéale pour l’itération actuelle du matériel.

Voici le très joli lien qui explique le stockage de INT signé et non signé en C –

http://answers.yahoo.com/question/index?qid=20090516032239AAzcX1O

Tiré de cet article ci-dessus –

“Un processus appelé complément à deux est utilisé pour transformer les nombres positifs en nombres négatifs. L’effet secondaire en 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 est un 1, alors le nombre est négatif. Si c’est 0, le nombre est positif. ”

Comme il ne s’agit que de mémoire, toutes les valeurs numériques sont finalement stockées en binary.

Un entier non signé de 32 bits peut contenir des valeurs de tous les 0 binarys à tous les 1 binarys.

Lorsqu’il s’agit d’un entier signé sur 32 bits, cela signifie que l’un de ses bits (le plus significatif) est un indicateur qui indique que la valeur est positive ou négative.

En supposant que int soit un entier de 16 bits (qui dépend de l’implémentation de C, la plupart en 32 bits de nos jours), la représentation des bits diffère comme suit:

  5 = 0000000000000101 -5 = 1111111111111011 

si le binary 1111111111111011 était défini sur un entier non signé, il serait décimal 65531.