-
-
Save phaya/ee27e97e2e6508f4f8af to your computer and use it in GitHub Desktop.
#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; | |
} |
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.
Creo que es porque para 100 años se ha excedido la capacidad de representación de un int, pero no estoy seguro...
¡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?
Creo que habría que poner como formato %lf tanto en el printf como en el scanf y declarar age como double
¡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?
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.
Tocado y hundido
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.