Travailler avec des grands entiers

Travailler avec des grands entiers - C - Programmation

Marsh Posté le 24-04-2008 à 10:18:33    

Bonjour,
 
J'suis un peu léger en C mais je doit coder un truc qui travail avec le nombre de millisecondes depuis 1970. Et là c'est le drame, je m'arrache les cheveux ...
 


#include <stdio.h>
#include <stdlib.h>
#include <time.h> // Pas necessaire ?
 
/*
 *  
 */
int main(int argc, char** argv)  
{
    struct timeval tv;
     
    printf( "Test 1 : %d\n" , 15 );
     
    gettimeofday(&tv, NULL);
    printf("Ce que je voudrais : %010ld%06ld\n", tv.tv_sec, tv.tv_usec);
    printf("Ce que j'ai        : %lld\n", (tv.tv_sec*1000000) + tv.tv_usec);
 
    unsigned long long test = (tv.tv_sec*1000000) + tv.tv_usec ;
             
    printf("?? : %lld \n", test );
     
    return (EXIT_SUCCESS);
}


 
Test 1 : 15
Ce que je voudrais : 1209024917211179
Ce que j'ai                : 907007111923755
?? : 213321771
 
Ca délire totalement, ça me donne des chiffre aléatoire. Je pensais que c'était des débordements   de limites mais finalement non ?  
 
Quelqu'un peut-ile me dire ce qui cloche ?
 
La "struct" n'est pê pas la pour rien mais j'aurai besoin d'ajouter des milisecondes dans une boucle et je ne sais pas comment gerer simplement le changement de secondes


---------------
"L'informatique n'est pas plus la science des ordinateurs que l'astronomie n'est celle des télescopes." Michael R. Fellows & Ian Parberry
Reply

Marsh Posté le 24-04-2008 à 10:18:33   

Reply

Marsh Posté le 24-04-2008 à 10:38:26    

La struct timeval contient des long, donc l'interval assuré va de -2 147 483 648 à 2 147 483 647.
 
En faisant long * 1000000 tu continues à bosser avec des long. Si tu veux bosser avec des long long, tu dois faire (long long)(tv.tv_sec) *1000000.
 
Exemple :

Code :
  1. #include <stdio.h>
  2. #include <limits.h>
  3.  
  4.  
  5. int main(void) {
  6.   long int longcat = LONG_MAX;
  7.  
  8.   long long int longlongcat = longcat * 1000000;
  9.   long long int reallonglongcat = (long long)(longcat) * 1000000;
  10.  
  11.   printf("longlongcat : %lld\n", longlongcat);
  12.   printf("reallonglongcat : %lld\n", reallonglongcat);
  13.  
  14.   return 0;
  15. }


 

$ a.out
longlongcat : -1000000
reallonglongcat : 2147483647000000

Reply

Marsh Posté le 24-04-2008 à 11:02:07    

Ah merci ça marche :D


---------------
"L'informatique n'est pas plus la science des ordinateurs que l'astronomie n'est celle des télescopes." Michael R. Fellows & Ian Parberry
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed