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
estsigned
et doit avoir une plage d’au moins-32767
à32767
comme exigence de plage minimale. Lelimits.h
désigne les valeurs réelles comme leurs valeurs correspondantes pourINT MIN
etINT MAX
. - Un
unsigned int
a une plage minimale qui s’étend de0
à65535
, inclus, avec la valeur maximale réelle définie par la constanteUINT_MAX
du fichier d’en-tête. Vous n’avez pas besoin d’utiliser l’un desbits
pour unsign
si 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
int
est de4 octets
, ce qui, multiplié par8
, donne32 bits
.4x8 = 32 bits
-
De plus, le
entier non signé
prend également jusqu’à4 octets
d’espace mémoire, ce qui fait un total de32 bits
.- Dans le type de données
int
, lebit
le plus à gauche dans les32-bits
est désigné pour lebit de signe
, qui indique si l’entier est positif ou négatif.1
indique une valeur négative, tandis que0
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
).
- 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