c integer-promotion

Promoción variable en C



integer-promotion (1)

Las conversiones aritméticas habituales se realizan en los operandos de adición. Para los tipos de enteros, esto consiste en las promociones de enteros si son necesarias, y si los dos operandos no tienen el mismo tipo, se realiza una conversión adicional para llevarlos a un tipo común.

En el primer caso no hay promociones, pero el operando int se convierte en unsigned int porque int no puede contener todos los valores posibles de unsigned int .

En el segundo caso, ambos operandos se promueven a int y permanecen como int porque tienen un tipo común.

Para referencia, el borrador de la norma C11 en la sección 6.5.6 Operadores de aditivos dice:

Si ambos operandos tienen tipo aritmético, se realizan las conversiones aritméticas habituales en ellos.

La sección 6.3.1.8 conversiones aritméticas habituales dice:

Muchos operadores que esperan operandos de tipo aritmético causan conversiones y producen tipos de resultados de una manera similar. El propósito es determinar un tipo real común para los operandos y el resultado . Para los operandos especificados, cada operando se convierte, sin cambio de tipo de dominio, a un tipo cuyo tipo real correspondiente es el tipo real común. A menos que se indique explícitamente lo contrario, el tipo real común también es el tipo real correspondiente del resultado , cuyo dominio de tipo es el dominio de tipo de los operandos si son los mismos, y complejos de lo contrario. Este patrón se llama las conversiones aritméticas habituales.

[...]

De lo contrario, las promociones enteras se realizan en ambos operandos. Luego se aplican las siguientes reglas a los operandos promovidos.

[...]

  • 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

[...]

Una buena referencia para la justificación de esto se puede encontrar en la pregunta: ¿Por qué se debe convertir un corto en un int antes de las operaciones aritméticas en C y C ++? .

Estoy teniendo un problema para averiguar por qué la salida es diferente en cada uno de estos casos particulares. En el Código de ejemplo a, hay una promoción variable como esperaba y el resultado es > 6 , pero en el Código de ejemplo b, el resultado es <= 6 :

/* **Code a** */ puts("Code a/n"); unsigned int a = 6; int b = -20; ( a+b > 6) ? puts("> 6/n") : puts("<= 6/n"); /* **Code b** */ puts("Code b:/n"); uint8_t a1 = 6; int8_t b1 = -20; ( a1+b1 > 6) ? puts("> 6/n") : puts("<= 6/n");

Salida:

Code a > 6 Code b: <= 6