2011-05-17 30 views
14

Duplicar posibles:
Addition of two chars produces intde desbordamiento de enteros - ¿Por qué no

Dado el siguiente código C++:

unsigned char a = 200; 
unsigned char b = 100; 

unsigned char c = (a + b)/2; 

La salida es de 150 como lógicamente esperar, sin embargo no debería haber un desbordamiento de enteros en la expresión (a + b)?

Obviamente debe haber una promoción entera para tratar el desbordamiento aquí, o está sucediendo algo más que no puedo ver. Me preguntaba si alguien podría iluminarme, por lo que puedo saber en qué puedo y no debo confiar en términos de promoción y desbordamiento de enteros.

+5

+1 para una pregunta bien escrita. – GManNickG

Respuesta

13

Ni C++ ni C realizan cálculos aritméticos con tipos enteros "más pequeños" como, char y short. Estos tipos casi siempre se promocionan a int antes de que comiencen otros cálculos. Por lo tanto, su expresión se evalúa realmente como

unsigned char c = ((int) a + (int) b)/2; 

P.S. En alguna plataforma exótica donde el rango de int no cubre el rango de unsigned char, se usará el tipo unsigned int como tipo objetivo para la promoción.

7

No, esto no es un error.

El compilador siempre calcula al menos una precisión entera, el resultado se convertirá de nuevo en una sesión sin signo en la asignación solamente.

Esto está en la norma.

0

Según otras respuestas, no es un error en x86 y otras (cuerdas) arquitecturas de 32 bits y 16 bits. No obstante, en arquitecturas más pequeñas o menos cuerdas (típicamente microcontroladores muy pequeños) cosas como esta probablemente comenzarán a causar problemas, especialmente si quien implementó su compilador no tiene el presupuesto de prueba/validación de algunas de las compañías más grandes. allí (de nuevo, microcontroladores).

Cuestiones relacionadas