Des réponses horribles à profusion
Ozgur Ozcitak
Lorsque vous passez du signé au non signé (et vice versa), la fonction interne interne du nombre ne change pas change pas. Ce qui change, c'est la façon dont le compilateur interprète le bit de signe.
C'est complètement faux.
Mats Fredriksson
Quand un non signé et un signé sont ajoutées (ou toute autre opération binaire) binaire), les deux sont implicitement implicitement converties en non signées, ce qui dans ce cas, le résultat serait énorme.
C'est également faux. Les ints non signés peuvent être promus en ints s'ils ont une précision égale en raison des bits de remplissage dans le type non signé.
smh
Votre opération d'addition fait que l'int en un int non signé.
Faux. Peut-être que oui, peut-être que non.
Conversion de unsigned int en signed int signé dépend de l'implémentation. (Mais cela fonctionne probablement comme vous l'attendez sur la plupart des plateformes de nos jours).
C'est faux. Soit le comportement est indéfini s'il provoque un débordement, soit la valeur est préservée.
Anonyme
La valeur de i est convertie en unsigned int ...
Faux. Cela dépend de la précision d'un int par rapport à un unsigned int.
Taylor Price
Comme il a été répondu précédemment, vous pouvez faire des allers-retours entre les valeurs signées et non signés sans problème.
Faux. Essayer de stocker une valeur en dehors de la plage d'un entier signé entraîne un comportement non défini.
Maintenant, je peux enfin répondre à la question.
Si la précision de int est égale à unsigned int, u sera promu en signed int et vous obtiendrez la valeur -4444 de l'expression (u+i). Maintenant, si u et i ont d'autres valeurs, vous pouvez obtenir un débordement et un comportement non défini, mais avec ces nombres exacts, vous obtiendrez -4444. [1] . Cette valeur sera de type int. Mais vous essayez de stocker cette valeur dans un int non signé, qui sera donc converti en un int non signé et la valeur qui en résultera sera (UINT_MAX+1) - 4444.
Si la précision de l'int non signé est supérieure à celle d'un int, l'int signé sera promu en int non signé, ce qui donnera la valeur (UINT_MAX+1) - 5678 qui sera ajoutée à l'autre int non signé 1234. Si u et i ont d'autres valeurs, qui font que l'expression tombe en dehors de la plage {0..UINT_MAX}, la valeur (UINT_MAX+1) sera ajoutée ou soustraite jusqu'à ce que le résultat tombe dans la plage {0..UINT_MAX) et aucun comportement indéfini ne se produira.
Qu'est-ce que la précision ?
Les nombres entiers ont des bits de remplissage, des bits de signe et des bits de valeur. Les entiers non signés n'ont évidemment pas de bit de signe. Il est également garanti que les caractères non signés n'ont pas de bits de remplissage. Le nombre de bits de valeur d'un nombre entier correspond à son degré de précision.
[Gotchas]
La macro sizeof seule ne peut pas être utilisée pour déterminer la précision d'un entier si des bits de remplissage sont présents. Et la taille d'un octet ne doit pas nécessairement être un octet (huit bits) comme le définit la norme C99.
[1] Le débordement peut se produire à l'un des deux points suivants. Soit avant l'addition (pendant la promotion) - lorsque vous avez un unsigned int qui est trop grand pour tenir dans un int. Le débordement peut également se produire après l'addition, même si le unsigned int était dans la plage d'un int, après l'addition le résultat peut encore déborder.