Skip to content

Instantly share code, notes, and snippets.

@phaya
Last active December 22, 2015 11:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save phaya/ee27e97e2e6508f4f8af to your computer and use it in GitHub Desktop.
Save phaya/ee27e97e2e6508f4f8af to your computer and use it in GitHub Desktop.
¿Por qué en el siguiente programa la conversión a segundos es errónea para 100 años?
#include <stdio.h>
int main()
{
int age;
printf("How old are you?\n");
scanf ("%d", &age);
printf("You are over %d seconds old\n", age*365*24*60*60);
return 0;
}
@ArturoBlazquez
Copy link

La conversión a segundos es incorrecta porque sobra el 12 de la multiplicación.
Además el programador no está teniendo en cuenta que los años bisiestos tienen 366 días en vez de 365.

@phaya
Copy link
Author

phaya commented Sep 28, 2013

ups...no se en que estaría pensando. He quitado la multiplicación por 12 que efectivamente estaba mal. Ignorando el hecho de que algunos años son bisiestos si pruebas con 100 años verás que el cálculo no se aproxima ni por asoma al cálculo real.

@javierdarna
Copy link

Creo que es porque para 100 años se ha excedido la capacidad de representación de un int, pero no estoy seguro...

@phaya
Copy link
Author

phaya commented Sep 30, 2013

¡Muy bien! Pero con un ligeros matices, primero la representación de un int varía según la plataforma. En los laboratorios ocupan 4 bytes (32 bits) Si se emplearan más bytes puede que no diera problemas. Para comprobar cuantos byes ocupa un entero lo más rápido es printf("%d", sizeof(int). Segundo, en este caso el problema no viene por int age si no por el resultado de la operación age*365*24*60*60 que es lo que desborda. Fijaros que especificador de formato se emplea en printf¿cómo solucionarías el código para obtener la salida correcta que para 100 años es 3153600000?

@anacidoncha
Copy link

Creo que habría que poner como formato %lf tanto en el printf como en el scanf y declarar age como double

@phaya
Copy link
Author

phaya commented Sep 30, 2013

¡Bien! Esa solución funciona y arregla el problema, pero se puede hacer sin tocar el tipo de datos de age, y manteniendo la salida del programa como un entero, en vez de un float ¿qué otros especificadores de formato se pueden utilizar con números enteros?

@anacidoncha
Copy link

Vale, creo que sería utilizando %u pues al no tener signo digamos que ampliamos el rango al doble (el de los positivos). No sé si me he explicado.

@phaya
Copy link
Author

phaya commented Oct 1, 2013

Tocado y hundido

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment