Esto es completamente incorrecto.
Esto también es incorrecto. Los enteros sin signo pueden promoverse a enteros 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 el int a convertir en un entero sin signo.
Wrong. Tal vez lo haga y tal vez no.
La conversión de unsigned int a la firma int depende de la implementación. (Pero que probablemente funciona de la forma esperada 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 unsigned int ...
incorrecto. Depende de la precisión de un int relativo a un int sin signo.
Taylor Precio
Como fue respondida con anterioridad, puede echado hacia atrás y adelante entre firmado y sin firmar y sin un problema.
Wrong. Intentar almacenar un valor fuera del rango de un entero con signo da como resultado un comportamiento indefinido.
Ahora puedo finalmente responder la pregunta.
Si la precisión de int fuera igual a unsigned int, se promocionará a un int firmado y obtendrá el valor -4444 de la expresión (u + i). Ahora, si usted y yo tenemos otros valores, es posible que tenga un exceso de flujo y un comportamiento indefinido, pero con esos números exactos obtendrá -4444 [1]. Este valor tendrá tipo int.Pero está intentando almacenar ese valor en un int sin firmar para que luego se convierta en un int sin firmar y el valor que resultará será (UINT_MAX + 1) - 4444.
¿Debería la precisión de unsigned? int ser mayor que la de un int, el int firmado se promocionará a un int sin signo que arroje el valor (UINT_MAX + 1) - 5678 que se agregará al otro unsigned int 1234. En caso de que uy tenga otros valores, lo que la expresión cae fuera del rango {0..UINT_MAX} el valor (UINT_MAX + 1) se agregará o restará hasta que el resultado caiga dentro del rango {0..UINT_MAX) y no se producirá ningún 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. El carácter sin signo está garantizado además de no tener bits de relleno. El número de bits de valores que tiene un número entero es la precisión que tiene.
[Gotchas]
El sizeof macro macro por sí sola no puede utilizarse para determinar la precisión de un número entero si bits de relleno están presentes. 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. O bien antes de la adición (durante la promoción): cuando tienes 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 firmar estaba dentro del rango de un int, después de la adición, el resultado puede desbordarse.
En una nota relacionada, Soy un estudiante recién graduado tratando de encontrar trabajo;)
Whoa allí. Está bien definido pasar de firmado a no firmado, pero pasar de unsigned a signed está definido por la implementación. – rlbond
Esto no es correcto. Desde un punto de vista del lenguaje La conversión del entero de 'int' a' unsigned int' tiene todo que ver con el valor del objeto fuente y nada (conceptualmente) con su representación interna. El valor se convierte usando la aritmética de módulo 2^N donde N es el número de bits de valor en una "int sin signo", cualquier representación que la implementación use para 'int'. –
Esta respuesta es simplemente incorrecta. Está explicando cómo funcionan las implementaciones comunes, no cómo funciona el lenguaje. –