bonsoir,
je viens tout juste de commencer le C.
j'essaye de fair un petit programme qui fait une multiplication de deux nombres de taille inférieur a 32bits. Pour la multiplication j'utilise l'algorithme de la division Russe (mais l'a n'est pas le problème).
Je décalle une variable de 64 bits (long long int) de 1 et quand je dépasse les 32bits il y a un truc qui foire !
avec les nombres 456789 et 456123 çà donne cette liste :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 int main () { unsigned int a , t1 ,t2 ; unsigned long long int b , res; int unsigned *c=malloc(sizeof(int)*3) ; c[0]=0 ; c[1]=0 ; c[2]=0 ; printf("\nEntrer vos deux nombres séparés d'un espace : ") ; scanf("%u%u" , &t1 , &t2 ) ; a=t1 ; b=t2 ; /* a=13 ; b=5 ; */ /* a=456789 ; b = 456123 ; */ printf("%u*%u==\n" , a , b) ; do { t1 = b>>32 ; t2 = b&0x0FFFFFFFF ; printf("%u\t| %u%u" , a , t1,t2) ; if (a%2==1){printf(" * "); res=c[0]+b ; if (res>>32==0){c[0]=res ; } else{c[1]=c[1]+(res>>32) ; c[0]=c[0] + (res & 0x0FFFFFFFF) ; } } printf("\n") ; a=a>>1 ; b=b<<1 ; }while (a>0) ; printf("\t%u%u\n" ,c[1],c[0] ) ; return 0 ; }/* main */
Entrer vos deux nombres séparés d'un espace : 456789 456123
456789*456123==
456789 | 0456123 *
228394 | 0912246
114197 | 01824492 *
57098 | 03648984
28549 | 07297968 *
14274 | 014595936
7137 | 029191872 *
3568 | 058383744
1784 | 0116767488
892 | 0233534976
446 | 0467069952
223 | 0934139904 *
111 | 01868279808 *
55 | 03736559616 *
27 | 13178151936 * <=première erreure il est attendu 7473119232 au lieux de 13178151936
13 | 32061336576 *
6 | 64122673152
3 | 133950379008 *
1 | 273605790720 *
472606621408 <= résultat obtenu
208351969047 <= résultat attendu
Cordialement
trax
Partager