Différence entre entier non signé et entier signé en C

Muhammad Zeeshan 12 octobre 2023
  1. Différence entre signed et non signé Int en C
  2. Exigences de mémoire
  3. Conclusion
Différence entre entier non signé et entier signé en C

L’article suivant explorera les distinctions entre int signé et non signé dans le langage de programmation C.

Différence entre signed et non signé Int en C

La distinction entre un signed int et un unsigned int n’est pas aussi compliquée que certains le pensent. Un signed int est souvent représenté par int, mais lorsqu’il s’agit de unsigned ints, nous devons écrire unsigned int.

Le fait que int est un type de données et unsigned n’est qu’un mot-clé a une fonction spécifique liée au niveau matériel. Cet objectif unique crée la différence la plus significative entre les deux, qui sera abordée plus en détail dans les parties suivantes.

  • Le type de données int est signed et doit avoir une plage d’au moins -32767 à 32767 comme exigence de plage minimale. Le limits.h désigne les valeurs réelles comme leurs valeurs correspondantes pour INT MIN et INT MAX.
  • Un unsigned int a une plage minimale qui s’étend de 0 à 65535, inclus, avec la valeur maximale réelle définie par la constante UINT_MAX du fichier d’en-tête. Vous n’avez pas besoin d’utiliser l’un des bits pour un sign si la valeur est unsigned.

Cela implique que vous recevez une plus grande variété d’encodages positifs au détriment d’aucuns négatifs.

Exigences de mémoire

Tout d’abord, vérifiez combien d’espace mémoire les signed int et les unsigned int occupent dans le système de l’ordinateur.

  1. La mémoire nécessaire pour un int est de 4 octets, ce qui, multiplié par 8, donne 32 bits.

    4x8 = 32 bits
    
  2. De plus, le entier non signé prend également jusqu’à 4 octets d’espace mémoire, ce qui fait un total de 32 bits.

    • Dans le type de données int, le bit le plus à gauche dans les 32-bits est désigné pour le bit de signe, qui indique si l’entier est positif ou négatif. 1 indique une valeur négative, tandis que 0 indique une valeur positive.
    • La plage d’entiers pouvant actuellement être stockés dans une variable int est de -(2^31) à 2^31-1, ce qui est égal à -2 147 483 648 à 2 147 483 647).

Lorsqu’un nombre négatif était entré dans l’ordinateur, il était représenté par le complément 2 de ce nombre sous forme binaire. De ce fait, les premiers bits de la mémoire seraient toujours mis à un, et l’ordinateur saurait qu’il a rencontré un nombre négatif chaque fois qu’il a vu le bit initial mis à 1.

Chaque fois que nous accédons à ce nombre, il revient à sa forme originale en lui appliquant le complément de 2. Cependant, avec le type de données unsigned int, il n’y a pas de bit comme signed bit.

Ainsi, il dispose désormais de tous les 32-bits que nous pouvons utiliser pour stocker les données. La plage d’entiers pouvant être stockés dans un entier non signé va de 0 à 2^32-1, ce qui équivaut à 0 à 4, 294, 967, 295, inclus.

La variable du type de données unsigned int est l’endroit où l’ordinateur stocke généralement les données au format binaire.

Prenons un exemple. Pour commencer, nous donnerons à la variable x une valeur initiale de type non signé.

Ensuite, lorsque nous avons essayé d’enregistrer le nombre négatif dans la variable unsigned int, l’ordinateur a utilisé le complément à 2 du nombre 123 pour le représenter comme un nombre négatif. Puis il a stocké cette représentation dans la mémoire de la variable x.

unsigned int x;
x = -123;

Ainsi, lorsque nous avons enregistré le -123 négatif dans la variable y du type de données int, l’ordinateur a pris le complément 2 du -123 pour le représenter comme un entier négatif, puis l’a stocké dans le mémoire de la variable y.

int y;
y = -123;

Les variables Unsigned int ne contiennent que des valeurs positives sous forme binaire standard ; aucun sign bit n’était réservé lorsque nous avons tenté d’accéder à sa mémoire via la mémoire de la variable x. En conséquence, l’ordinateur n’a pas eu besoin de conversions, et le complément 2 qui avait été précédemment enregistré a été récupéré et affiché sous la forme d’un nombre binaire normal.

printf("%d\n", x);

Lorsque nous avons tenté d’accéder à la mémoire de la variable y, l’ordinateur a déterminé qu’il s’agissait du type de données int. Il a ensuite vérifié le bit à gauche de la position la plus à gauche 32 bits et a constaté qu’il s’agissait de 1.

En conséquence, il reprenait le complément du 2, ajoutait un signe négatif (-) et imprimait le résultat.

printf("%d\n", y);

Code source complet :

#include <stdio.h>

int main() {
  unsigned int x;
  x = -123;
  int y;
  y = -123;
  printf("%d\n", x);
  printf("%d\n", y);
  return 0;
}

Production:

- 123 - 123

Conclusion

Maintenant que nous connaissons les principales distinctions entre entiers signés et entiers non signés, vous devez également savoir que plusieurs avantages et inconvénients sont associés aux deux formes de données, dont l’équilibre dépend entièrement de vos besoins.

Par exemple, vous devez utiliser unsigned int si vous souhaitez stocker des nombres énormes, et vous êtes sûr qu’il n’y aura jamais de valeur négative. Sinon, il serait utile d’utiliser le type de données int.

Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn

Article connexe - C Integer