Red de conocimientos sobre prescripción popular - Remedios caseros - ¿El resultado de agregar el tipo char y el tipo int es tipo char o tipo int?

¿El resultado de agregar el tipo char y el tipo int es tipo char o tipo int?

Supongamos que el lenguaje de programación es C/C++.

En términos generales, el resultado es de tipo int. Si char se implementa como unsigned char y tiene la misma longitud que int en el compilador, el resultado será unsigned int.

Para realizar una operación aritmética, los operandos primero se convierten en números enteros. La llamada promoción de enteros se refiere a la conversión de tipos de acuerdo con las siguientes reglas:

Para tipos como bool, (firmado/sin firmar) char, (sin firmar) corto, etc., siempre que se utilicen todos sus valores posibles. los valores pueden existir en int, se promueve para escribir int; de lo contrario, se promueve para escribir int sin firmar; Por ejemplo, cuando agrega dos caracteres con signo, ambos caracteres con signo se promocionan a int.

Los tipos de caracteres grandes (wchar_t, char16_t, char32_t) se actualizan a los tipos más pequeños entre int, unsigned int, long, unsigned long, long long y unsigned long long, que pueden acomodar todos los valores posibles de el tipo original.

Después de la promoción de números enteros, no se requiere ninguna conversión adicional si los tipos de resultados coinciden. Si ambos operandos (promocionados) están firmados o sin firmar, el tipo pequeño se convierte al tipo grande. Por ejemplo, si agrega int a long, el resultado es long.

Si un operando no está firmado y el otro operando está firmado, hay dos situaciones:

El tipo sin signo no es más pequeño que el tipo con signo (como sin signo largo e int), convertido a sin firmar. Por ejemplo, en el título original, si char se implementa como un char unsigned con la misma longitud que int, entonces el char de promoción entera se convierte primero en unsigned int (int no puede acomodar todos los valores posibles de char), y luego el int se agrega a unsigned int, luego convierte int a unsigned int y el resultado final es unsigned int.

Los tipos sin firmar son más pequeños que los tipos con signo y el resultado depende de la máquina. Si todos los valores del tipo sin signo pueden existir en el tipo con signo, el tipo sin signo se convierte en un tipo con signo; de lo contrario, el tipo con signo se convierte en un tipo sin signo.