Réponses horribles à gogo
Ozgur Ozcitak
Lorsque vous transtypez de signé à non signé (et vice versa), la représentation interne du nombre ne 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 une variable non signée et une variable signée sont ajoutées (ou toute opération binaire), les deux sont implicitement converties en non signées, ce qui dans ce cas entraînerait un résultat énorme.
Ceci est également faux. Les entiers non signés peuvent être promus en entiers s'ils ont une précision égale en raison de bits de remplissage dans le type non signé.
smh
Votre opération d'addition entraîne la conversion de l'int en un int non signé.
Faux. Peut-être que oui et peut-être pas.
La conversion d'un entier non signé en un entier signé dépend de l'implémentation. (Mais cela fonctionne probablement comme vous l'attendez sur la plupart des plates-formes de nos jours.)
Faux. Il s'agit d'un comportement non défini s'il provoque un débordement ou la valeur est conservée.
Anonyme
La valeur de i est convertie en un entier non signé ...
Faux. Dépend de la précision d'un int par rapport à un int non signé.
Prix Taylor
Comme il a été répondu précédemment, vous pouvez passer sans problème entre signé et non signé.
Faux. Essayer de stocker une valeur en dehors de la plage d'un entier signé entraîne un comportement indéfini.
Maintenant, je peux enfin répondre à la question.
Si la précision de int est égale à unsigned int, u sera promu en int signé et vous obtiendrez la valeur -4444 à partir de l'expression (u + i). Maintenant, si u et moi avons d'autres valeurs, vous pouvez avoir un comportement de débordement et indéfini, mais avec ces nombres exacts, vous obtiendrez -4444 [1] . Cette valeur aura le type int. Mais vous essayez de stocker cette valeur dans un entier non signé afin qu'il soit ensuite converti en un entier non signé et la valeur que le résultat finira par avoir serait (UINT_MAX + 1) - 4444.
Si la précision de unsigned int est supérieure à celle d'un int, le signé int sera promu en unsigned int donnant la valeur (UINT_MAX + 1) - 5678 qui sera ajoutée à l'autre unsigned int 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 soit ajoutée soit 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 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. Le caractère non signé est en outre garanti pour ne pas avoir de bits de remplissage. Le nombre de bits de valeurs d'un entier correspond à sa précision.
[Gotchas]
La macro sizeof macro 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 défini par C99.
[1] Le débordement peut se produire à l'un des deux points. Soit avant l'ajout (pendant la promotion) - lorsque vous avez un int non signé qui est trop grand pour tenir dans un int. Le débordement peut également se produire après l'ajout, même si l'int non signé était dans la plage d'un int, après l'ajout, le résultat peut encore déborder.