2011-09-24 7 views
10

Hay código:Adición de dos variables unsigned char y el resultado es int

#include <iostream> 
int main(){ 
    unsigned char a = 4, b = 255; 
    int g = (unsigned char)a + (unsigned char)b; 
    std::cout << g << std::endl; 
    return 0; 
} 

Resultado:

259 

Por qué el resultado es 259, no 3? Si se añaden dos variables unsigned char, no debe haber desbordamiento, resultado debe ser 3 y entonces se debe convertir de unsigned char a int 3 3.

Respuesta

14

La operación de adición en primer lugar promote sus operandos a int, antes de hacer la adición . Así es como C funciona. Si desea truncar, debe volver a asignarlo a un tipo más restringido, como unsigned char.

6

La aritmética de enteros nunca se realiza en tipos de datos menores que int. Por ejemplo, para tipos inferiores a int, p. si se agregan dos tipos char y short int, se promueven a int antes de cualquier operación aritmética y el resultado es un tipo de entero. Si uno de los tipos resulta ser más grande que int. Ej. long long int y int, int se promociona a long long int y el resultado es long long int.

(§ 4.5/1) - Una rvalue de tipo char, char firmado, unsigned char, corta int o unsigned short int puede ser convertido a un valor p de tipo int si int puede representar todo el valores del tipo de fuente; de lo contrario, el valor de origen r puede ser convertido a un valor r de tipo unsigned int.

Cuestiones relacionadas