Comment convertir ou convertir un entier non signé en entier 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!

Cela dépend de ce que vous voulez que le comportement soit. Un int ne peut contenir beaucoup des valeurs qu’un unsigned int peut.

Vous pouvez lancer comme d’habitude:

 int signedInt = (int) myUnsigned; 

mais cela posera des problèmes si la valeur unsigned est supérieure au maximum que int peut contenir. Cela signifie que la moitié des valeurs unsigned possibles entraînera un comportement erroné à moins que vous ne le surveilliez spécifiquement.

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 plate-forme. Mais vous pouvez y accéder avec INT_MAX et UINT_MAX .

Pour les types habituels de 4 octets:

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

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

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

Unsigned int peut être converti en signé (ou inversement) par une expression simple, comme indiqué ci-dessous:

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

Bien que non ciblé par la question, vous voudriez lire les liens suivants:

  • signé à la conversion non signée en C – est-il toujours sûr?
  • performance des entiers non signés vs signés
  • Valeurs non signées et signées en C
  • Quelles sont les conversions de type?

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

C’est aussi simple que ça:

 unsigned int foo; int bar = 10; foo = (unsigned int)bar; 

Ou vice versa…

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