Desbordamiento de enteros: ¿por qué no [duplicar]
-
14-11-2019 - |
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.
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).