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:
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.