web-dev-qa-db-fra.com

Comment convertir ou convertir un int non signé en int en C?

Mes excuses si la question semble bizarre. Je débogue mon code et cela semble être le problème, mais je ne suis pas sûr.

Merci!

16
Eric Brotto

Cela dépend de ce que vous voulez que le comportement soit. Un int ne peut pas contenir la plupart des valeurs qu'un unsigned int pouvez.

Vous pouvez lancer comme d'habitude:

int signedInt = (int) myUnsigned;

mais cela posera des problèmes si la valeur de unsigned est dépassée par la valeur maximale de int. Cela signifie que la moitié des valeurs unsigned possibles entraîneront un comportement erroné, sauf si vous y faites particulièrement attention.

Vous devriez probablement réexaminer la façon dont vous stockez les valeurs en premier lieu si vous devez convertir sans raison valable.

EDIT: Comme mentionné par ProdigySim dans les commentaires, la valeur maximale dépend de la plateforme. Mais vous pouvez y accéder avec INT_MAX et UINT_MAX.

Pour les types habituels à 4 octets:

4 bytes = (4*8) bits = 32 bits

Si tous les 32 bits sont utilisés, comme dans unsigned, la valeur maximale sera 2 ^ 32 - 1, ou 4,294,967,295.

Un int signé sacrifie effectivement un bit pour le signe, donc la valeur maximale sera 2 ^ 31 - 1, ou 2,147,483,647. Notez qu'il s'agit de la moitié de l'autre valeur.

24
Chris Cooper

Un entier non signé peut être converti en signé (ou vice-versa) par une simple expression comme indiqué ci-dessous:

unsigned int z;
int y=5;
z= (unsigned int)y;   

Bien que n'étant pas ciblé sur la question, vous souhaitez lire les liens suivants:

4
sgokhales

Si vous avez une variable unsigned int x;, vous pouvez le convertir en int en utilisant (int)x.

2
Jeremiah Willcock

C'est aussi simple que ça:

unsigned int foo;
int bar = 10;

foo = (unsigned int)bar;

Ou vice versa...

1
DarkDust

Certains expliquent de C++ Primer 5th Page 35

Si nous attribuons une valeur hors plage à un objet de type non signé, le résultat est le reste de la valeur modulo le nombre de valeurs que le type cible peut contenir.

Par exemple, un caractère non signé 8 bits peut contenir des valeurs comprises entre 0 et 255 inclus. Si nous attribuons une valeur en dehors de la plage, le compilateur affecte le reste de cette valeur modulo 256.

unsigned char c = -1; // assuming 8-bit chars, c has value 255

Si nous attribuons une valeur hors plage à un objet de type signé, le résultat n'est pas défini. Le programme peut sembler fonctionner, il peut se bloquer ou il peut produire des valeurs inutiles.

Page 160: Si un opérande est un type non signé, le type dans lequel les opérandes sont convertis dépend des tailles relatives des types intégraux sur la machine.

... Lorsque la signature est différente et que le type de l'opérande non signé est identique ou supérieur à celui de l'opérande signé, l'opérande signé est converti en non signé.

Le cas restant est celui où l'opérande signé a un type plus grand que l'opérande non signé. Dans ce cas, le résultat dépend de la machine. Si toutes les valeurs du type non signé correspondent au grand type, l'opérande non signé est converti en type signé. Si les valeurs ne correspondent pas, l'opérande signé est converti en type non signé.

Par exemple, si les opérandes sont longs et non signés int, et int et long ont la même taille, la longueur sera convertie en entier non signé. Si le type long a plus de bits, l'int entier non signé sera converti en long.

J'ai trouvé la lecture de ce livre très utile.

1
Jixuan Cheng

Si un int non signé et un int (signé) sont utilisés dans la même expression, l'int signé est converti implicitement en non signé. C'est une caractéristique assez dangereuse du langage C, et vous devez donc en être conscient. Cela peut ou non être la cause de votre bogue. Si vous voulez une réponse plus détaillée, vous devrez publier du code.

0
Lundin