Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: kutcher en 23 Agosto 2014, 02:53 am



Título: Como detectar un desbordamiento de enteros
Publicado por: kutcher en 23 Agosto 2014, 02:53 am
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 


Título: Re: Como detectar un desbordamiento de enteros
Publicado por: Blaster en 23 Agosto 2014, 03:44 am
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
  1. size_t bit_mayor(unsigned n)
  2. {
  3.    size_t bits = 0;
  4.    while (n) ++bits, n >>= 1;
  5.  
  6.    return bits;
  7. }
  8.  
  9. bool mult_segura(unsigned a, unsigned b)
  10. {
  11.    size_t a_bits = bit_mayor(a), b_bits= bit_mayor(b);
  12.    return ( a_bits + b_bits <= 32 );
  13. }
  14.  
  15. int main(void)
  16. {
  17.    unsigned a = 2, b = 4294967295;
  18.    unsigned result = 0;
  19.  
  20.    if(mult_segura(a, b))
  21.    {
  22.        result = a * b;
  23.        printf("Multiplicacion: %u\n", result);
  24.    }
  25.    else
  26.        puts("Posible desbordamiento de enteros");
  27.  
  28.    return 0;
  29. }
  30.  

Saludos


Título: Re: Como detectar un desbordamiento de enteros
Publicado por: rir3760 en 23 Agosto 2014, 07:06 am
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
a * b > MAX ==> a > MAX / b, b > MAX / a

Un saludo


Título: Re: Como detectar un desbordamiento de enteros
Publicado por: kutcher en 24 Agosto 2014, 03:30 am
Excelente gracias por responder Blaster y rir3760 voy a probar los metódos que me proponieron

Saludos kutcher


Título: Re: Como detectar un desbordamiento de enteros
Publicado por: NOB2014 en 24 Agosto 2014, 22:26 pm
Hola a todos y que tengan un muy buen día.-
rir ¿esto tiene que ver con la fórmula que proponías?

Código
  1. //a * b > MAX ==> a > MAX / b, b > MAX / a
  2.  
  3. #include<stdio.h>
  4.  
  5. int main(void){
  6. unsigned int a = 2147483648, b=2, c=0, d = -1;
  7. c = d/b;
  8.  
  9. if(a>c)
  10. printf("\n %u * %u supera el m%cximo permitido --> %u", a, b, 160, d);
  11. else{
  12. c = a*b;
  13. printf("\n %u * %u = %u", a, b, c);
  14. }
  15.  
  16.  
  17. printf("\n\n");
  18. return 0;
  19.  
  20. }
  21.  

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