Desbordamiento de enteros es la Ejemplo canónico de "comportamiento indefinido" en C (teniendo en cuenta que las operaciones en enteros sin signo nunca se desbordan, en su lugar se definen para envolver). Esto significa que una vez que haya ejecutado x + y
, si se desbordó, ya está con la manguera. Es muy tarde para hacer una comprobación: su programa ya podría haberse bloqueado. Piense en ello como buscar la división por cero: si espera hasta después de que se haya ejecutado la división para verificar, ya es demasiado tarde.
Esto implica que el método (1) es la única forma correcta de hacerlo. Para max
, puede usar INT_MAX
desde <limits.h>
.
Si x
y/o y
pueden ser negativos, entonces las cosas son más difíciles: debe realizar la prueba de forma que la prueba en sí no pueda causar el desbordamiento.
if ((y > 0 && x > INT_MAX - y) ||
(y < 0 && x < INT_MIN - y))
{
/* Oh no, overflow */
}
else
{
sum = x + y;
}
En realidad, el duplicado no es un duplicado en absoluto, que está hablando de 'unsigned' que han bien definidas semántica envolventes, mientras que desborda un entero con signo es un comportamiento indefinido en C. –
No hay necesidad de comprobar tanto 'suma