En una expresión C donde están presentes unsigned int y signed int, ¿qué tipo se promocionará a qué tipo?

Tengo una consulta sobre las reglas de promoción de tipo de datos en C estándar de idioma. El C99 dice que:

Las promociones de C enteros también requieren que “si un int puede representar todos los valores del tipo original, el valor se convierte en un int; de lo contrario, se convierte en un int sin firmar”.

Mi pregunta es en el caso de una expresión de lenguaje C en la que estén presentes unsigned int y signed int , ¿qué tipo se promocionará a qué tipo?

Por ejemplo, int no puede representar todos los valores de unsigned int (valores mayores que MAX_INT ) mientras que unsigned int no puede representar los valores -ve, entonces ¿qué tipo se promueve a qué en tales casos?

Creo que lo siguiente responde a tu pregunta:

6.3.1.3 enteros con signo y sin signo

1 Cuando un valor con tipo entero se convierte a otro tipo entero distinto de _Bool, si el valor puede representarse con el tipo nuevo, no se modifica.

2 De lo contrario, si el nuevo tipo no está firmado, el valor se convierte al agregar o restar repetidamente uno más que el valor máximo que se puede representar en el nuevo tipo hasta que el valor esté en el rango del nuevo tipo.

3 De lo contrario, el nuevo tipo se firma y el valor no se puede representar en él; el resultado es definido por la implementación o se genera una señal definida por la implementación.

Creo que estás confundiendo dos cosas. La promoción es el proceso mediante el cual los valores de tipo entero “más pequeño” que int / unsigned int se convierten en int o unsigned int. Las reglas se expresan de forma algo extraña (sobre todo para el beneficio de manejar adecuadamente el carbón) pero aseguran que el valor y el signo se conserven.

Luego está el concepto diferente de conversión aritmética usual mediante el cual los operandos de operadores aritméticos se convierten a un tipo común. Comienza promocionando el operando (ya sea int o unsigned) si son de un tipo más pequeño que int y luego elige un tipo de destino mediante el siguiente proceso (para tipos enteros, 6.3.1.8/1)

Si ambos operandos tienen el mismo tipo, entonces no se necesita más conversión.

De lo contrario, si ambos operandos tienen tipos enteros con signo o ambos tienen tipos enteros sin signo, el operando con el tipo de rango de conversión entero menor se convierte al tipo del operando con mayor rango.

De lo contrario, si el operando que tiene un tipo entero sin signo tiene un rango mayor o igual al rango del tipo del otro operando, entonces el operando con tipo entero con signo se convierte al tipo del operando con tipo entero sin signo.

De lo contrario, si el tipo del operando con tipo entero con signo puede representar todos los valores del tipo del operando con tipo entero sin signo, entonces el operando con tipo entero sin signo se convierte al tipo del operando con tipo entero con signo.

De lo contrario, ambos operandos se convierten al tipo de entero sin signo correspondiente al tipo de operando con tipo de entero con signo.

(Tenga en cuenta que ISTR que esas reglas han cambiado ligeramente entre C89 y C99)