78 votes

La vraie différence entre "int" et "unsigned int"

entier :

Le type de données int 32 bits peut contenir des valeurs entières dans la plage de 2 147 483 648 à 2 147 483 647. Vous pouvez également vous référer à ce type de données comme signé int ou signé.

entier non signé :

Les données int non signées 32 bits type peut contenir des valeurs entières comprises entre 0 et 4 294 967 295. Tu peut également désigner ce type de données simplement comme non signé.

D'accord, mais en pratique :

 int x = 0xFFFFFFFF;
unsigned int y = 0xFFFFFFFF;
printf("%d, %d, %u, %u", x, y, x, y);
// -1, -1, 4294967295, 4294967295

aucune différence, Oo je suis un peu confus.

57voto

cha0site Points 5675

Héhé. Vous avez un transtypage implicite ici, car vous dites à printf quel type s'attendre.

Essayez plutôt ceci pour la taille :

 unsigned int x = 0xFFFFFFFF;
int y = 0xFFFFFFFF;

if (x < 0)
    printf("one\n");
else
    printf("two\n");
if (y < 0)
    printf("three\n");
else
    printf("four\n");

23voto

Nathan Day Points 3672

Il n'y a pas de différence entre les deux dans la façon dont ils sont stockés dans la mémoire et les registres, il n'y a pas de version signée et non signée des registres int, il n'y a pas d'informations signées stockées avec l'int, la différence ne devient pertinente que lorsque vous effectuez des opérations mathématiques, il y a version signée et non signée des opérations mathématiques intégrées au processeur et la signature indique au compilateur quelle version utiliser.

4voto

Rafał Rawicki Points 10069

La représentation interne de int et unsigned int est la même.

Par conséquent, lorsque vous passez la même chaîne de format à printf elle sera imprimée de la même manière.

Cependant, il existe des différences lorsque vous les comparez. Envisager:

 int x = 0x7FFFFFFF;
int y = 0xFFFFFFFF;
x < y // false
x > y // true
(unsigned int) x < (unsigned int y) // true
(unsigned int) x > (unsigned int y) // false

Cela peut également être une mise en garde, car lors de la comparaison d'entiers signés et non signés, l'un d'entre eux sera implicitement converti pour correspondre aux types.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X