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
intestsignedet doit avoir une plage d’au moins-32767à32767comme exigence de plage minimale. Lelimits.hdésigne les valeurs réelles comme leurs valeurs correspondantes pourINT MINetINT MAX. - Un
unsigned inta une plage minimale qui s’étend de0à65535, inclus, avec la valeur maximale réelle définie par la constanteUINT_MAXdu fichier d’en-tête. Vous n’avez pas besoin d’utiliser l’un desbitspour unsignsi la valeur estunsigned.
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.
-
La mémoire nécessaire pour un
intest de4 octets, ce qui, multiplié par8, donne32 bits.4x8 = 32 bits -
De plus, le
entier non signéprend également jusqu’à4 octetsd’espace mémoire, ce qui fait un total de32 bits.- Dans le type de données
int, lebitle plus à gauche dans les32-bitsest désigné pour lebit de signe, qui indique si l’entier est positif ou négatif.1indique une valeur négative, tandis que0indique une valeur positive. - La plage d’entiers pouvant actuellement être stockés dans une variable
intest de-(2^31)à2^31-1, ce qui est égal à-2 147 483 648à2 147 483 647).
- Dans le type de données
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.
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