Como detectar un desbordamiento de enteros

Iniciado por kutcher, 23 Agosto 2014, 02:53 AM

0 Miembros y 1 Visitante están viendo este tema.

kutcher

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 

Blaster

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:

Código (cpp) [Seleccionar]
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

rir3760

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

kutcher

Excelente gracias por responder Blaster y rir3760 voy a probar los metódos que me proponieron

Saludos kutcher

NOB2014

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
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-