Buenas, quisiera saber algún método para detectar un posible desbordamiento de enteros al realizar una multiplicación de dos variables de tipo unsigned para asi almacenar con seguridad el resultado en otra, le estuve dando vueltas al asunto pero no encuentro como hacerlo
Saludos kutcher
Hay una manera de determinar si una operación es probable que desborde usando las posiciones de los bits uno más significativos por ejemplo:
size_t bit_mayor(unsigned n)
{
size_t bits = 0;
while (n) ++bits, n >>= 1;
return bits;
}
bool mult_segura(unsigned a, unsigned b)
{
size_t a_bits = bit_mayor(a), b_bits= bit_mayor(b);
return ( a_bits + b_bits <= 32 );
}
int main(void)
{
unsigned a = 2, b = 4294967295;
unsigned result = 0;
if(mult_segura(a, b))
{
result = a * b;
printf("Multiplicacion: %u\n", result);
}
else
puts("Posible desbordamiento de enteros");
return 0;
}
Saludos
Cita de: kutcher en 23 Agosto 2014, 02:53 AMquisiera saber algún método para detectar un posible desbordamiento de enteros al realizar una multiplicación de dos variables de tipo unsigned para asi almacenar con seguridad el resultado en otra
a * b > MAX ==> a > MAX / b, b > MAX / a
Un saludo
Excelente gracias por responder Blaster y rir3760 voy a probar los metódos que me proponieron
Saludos kutcher
Hola a todos y que tengan un muy buen día.-
rir ¿esto tiene que ver con la fórmula que proponías?
//a * b > MAX ==> a > MAX / b, b > MAX / a
#include<stdio.h>
int main(void){
unsigned int a = 2147483648, b=2, c=0, d = -1;
c = d/b;
if(a>c)
printf("\n %u * %u supera el m%cximo permitido --> %u", a, b, 160, d);
else{
c = a*b;
printf("\n %u * %u = %u", a, b, c);
}
printf("\n\n");
return 0;
}
Kutcher mil disculpas por interferir en tú hilo pero no me pareció atinado hacer un post tan cercano y con la misma pregunta, es que me pareció interesante el tema sólo que tenía dudas con la formula de rir3760, lo de Blaster es por el momento demasiado avanzado para este momento mío.-
Saludos.
Daniel