Pregunta

Posible duplicado:
La suma de dos caracteres produce int

Dado el siguiente código C++:

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

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

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

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

¿Fue útil?

Solución

Ni C++ ni C realizan cálculos aritméticos dentro de tipos enteros "más pequeños" como, char y short.Estos tipos casi siempre son ascendidos a int antes de que comiencen más cálculos.Entonces, tu expresión realmente se evalúa como

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

PDEn alguna plataforma exótica donde la variedad de int no cubre el rango de unsigned char, el tipo unsigned int se utilizará como tipo de objetivo para la promoción.

Otros consejos

No, esto no es un error.

El compilador siempre calcula con una precisión mínima de enteros; el resultado se volverá a convertir a caracteres sin signo solo en la asignación.

Esto está en la norma.

Según otras respuestas, no es un error. en x86 y otras arquitecturas (sanas) de 32 bits y 16 bits.

Sin embargo, en arquitecturas más pequeñas o menos sensatas (normalmente 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 empresas más grandes que existen (nuevamente, microcontroladores).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top