Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Prueba con overflow

Estas en el tema de Prueba con overflow en el foro de C/C++ en Foros del Web. Hola amigos, ya conseguí hacer esto en C sin problemas para enteros pero luego he pensado otro modo y queria saber porque no funciona. Mirad ...
  #1 (permalink)  
Antiguo 13/11/2015, 07:24
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 9 meses
Puntos: 3
Prueba con overflow

Hola amigos, ya conseguí hacer esto en C sin problemas para enteros pero luego he pensado otro modo y queria saber porque no funciona. Mirad lo que probé:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(int argc, char* argv[])
  5. {
  6.    int EFlags,valor,isOverflow;
  7.    int pos_bit_overflow=11;
  8.  
  9.    printf("Introduce un valor entero: ");
  10.    scanf("%i",&valor);
  11.    __asm
  12.    {
  13.       pushfd // store flags (32 bits)
  14.       pop EFlags // EFlags = flags w/overflow
  15.    }
  16.    isOverflow=(EFlags & (1 << pos_bit_overflow));
  17.    if(isOverflow != 0){
  18.       printf("Huvo overflow\n");
  19.    }
  20.    system("PAUSE");
  21.    return 0;
  22. }
¿por que si meto un valor que desborda la variable no se activa el bit de overflow del EFlag? ¿falta algo mas para que funcione de esa forma?
  #2 (permalink)  
Antiguo 13/11/2015, 09:46
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 10 meses
Puntos: 27
Respuesta: Prueba con overflow

El bit de overflow del registro de la CPU se activa si la última operación que entrara a la ALU hubiese producido un error, eso no tiene que ver nada con una llamada a una función en C.

Si la última operación que hiciese la ALU dio overflow entonces ese bit estará activo sino no. Si por ejemplo supones una variable x= (1 << 31) si justo antes de meter y sacar de la pila el contenido de las banderas realizas y=x * x; eso te dará overflow (x e y son ints 32 bits).

Esto se debe a que cuando tu pongas ese código si supones x en el registro %ebx y que el registro %eax está sin utilizar podría hacer un código similar a este:

Código C:
Ver original
  1. // cdecl assembly
  2.        movl %ebx, %eax // Copio x en otro registro
  3.        imull %eax, %eax // x*x y lo guardo y lo guaro en %eax
Si tu en este momento compruebas e imull (multiplicación de enteros con signo) provocó overflow el bit de signo estará activado.

Si tu llamas a scanf y haces eso compruebas que lo último que la última instrucción máquina que modificara la ALU no diera lugar a overflow, yo no tengo ni idea de cual será pero seguro que no es una que provoca overflow.
  #3 (permalink)  
Antiguo 13/11/2015, 11:34
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 9 meses
Puntos: 3
Respuesta: Prueba con overflow

Pues entonces para eso no es válido jejeje. De todos modos ya lo resolví de otro modo.

Etiquetas: char, funcion, int, overflow, prueba
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:20.