Respuestas horribles en abundancia
Ozgur Ozcitak
Cuando se convierte de firmado a no firmado (y viceversa), la representación interna del número no cambia. Lo que cambia es cómo el compilador interpreta el bit de signo.
Esto está completamente mal.
Mats Fredriksson
Cuando se agregan una variable sin signo y una con signo (o cualquier operación binaria) ambas se convierten implícitamente en sin signo, lo que en este caso daría como resultado un gran resultado.
Esto también está mal. Los ints sin signo pueden promoverse a ints si tienen la misma precisión debido a los bits de relleno en el tipo sin signo.
smh
Su operación de suma hace que int se convierta en un int sin signo.
Incorrecto. Tal vez sí y tal vez no.
La conversión de int sin signo a int con signo depende de la implementación. (Pero probablemente funcione de la manera que espera en la mayoría de las plataformas en estos días).
Incorrecto. Es un comportamiento indefinido si causa un desbordamiento o si se conserva el valor.
Anónimo
El valor de i se convierte en int sin signo ...
Incorrecto. Depende de la precisión de un int relativo a un int sin signo.
Taylor Price
Como se respondió anteriormente, puede emitir de un lado a otro entre firmado y sin firmar sin ningún problema.
Incorrecto. Intentar almacenar un valor fuera del rango de un entero con signo da como resultado un comportamiento indefinido.
Ahora finalmente puedo responder la pregunta.
Si la precisión de int es igual a unsigned int, u será promovido a int firmado y obtendrá el valor -4444 de la expresión (u + i). Ahora, si tu y yo tenemos otros valores, puedes obtener un desbordamiento y un comportamiento indefinido, pero con esos números exactos obtendrás -4444 [1] . Este valor tendrá el tipo int. Pero está tratando de almacenar ese valor en un int sin signo para que luego se convierta en un int sin signo y el valor que terminará teniendo sería (UINT_MAX + 1) - 4444.
En caso de que la precisión de unsigned int sea mayor que la de int, se promoverá a unsigned int a unsigned int produciendo el valor (UINT_MAX + 1) - 5678 que se agregará a la otra unsigned int 1234. Si tu y yo tenemos otros valores, que hacen que la expresión caiga fuera del rango {0..UINT_MAX}, el valor (UINT_MAX + 1) se agregará o restará hasta que el resultado NO se encuentre dentro del rango {0..UINT_MAX) y no se producirá un comportamiento indefinido .
¿Qué es la precisión?
Los enteros tienen bits de relleno, bits de signo y bits de valor. Los enteros sin signo no tienen un bit de signo obviamente. Unsigned char está garantizado además de no tener bits de relleno. El número de bits de valores que tiene un entero es la precisión que tiene.
[Gotchas]
El tamaño de macro de la macro por sí solo no se puede utilizar para determinar la precisión de un entero si hay bits de relleno. Y el tamaño de un byte no tiene que ser un octeto (ocho bits) como lo define C99.
[1] El desbordamiento puede ocurrir en uno de dos puntos. Antes de la adición (durante la promoción): cuando tiene un int sin firmar que es demasiado grande para caber dentro de un int. El desbordamiento también puede ocurrir después de la adición, incluso si el int sin signo estaba dentro del rango de un int, después de la adición, el resultado puede desbordarse.