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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| #include <stdio.h>
#include <stdlib.h>
int main(void)
{
unsigned int a , t1 ,t2 ;
unsigned long long int llb , llRes;
unsigned int *pt_c = malloc(sizeof(*pt_c)*3);
/* Ajouté */
if(pt_c == NULL)
return EXIT_FAILURE;
pt_c[0] = 0;
pt_c[1] = 0;
pt_c[2] = 0 ;
/* J'ai pas l'habitude d'utiliser scanf, mais on va faire avec */
//printf("\nEntrer vos deux nombres séparés d'un espace : ") ;
//scanf("%u%u" , &t1 , &t2 ) ;
a = t1;
llb = t2 ;
/* a=13 ; b=5 ; */
a=456789 ; llb = 456123 ; // */
/* Le printf() était erroné (manquait le préfixe "long long" */
/* Sous Win32, %llu est remplacé par %I64u */
//printf("\n%u * %llu == %08X * %016llX ==\n\n", a, llb, a, llb) ;
printf("\n%u * %I64u == %08X * %016I64X ==\n\n", a, llb, a, llb) ;
do {
/* Ça revient sans doute au même, mais je préfère mettre toute la largeur:
C'est plus compréhensible. */
t1 = llb>>32;
t2 = llb & 0x00000000FFFFFFFF;
/* Deux entiers décimaux affichés côte-à-côte, ça ne le fait pas. */
printf("%08X\t| %08X:%08X", a, t1, t2) ;
if(a%2 == 1) /* Ou if(a & 1) */
{
printf(" * ");
llRes = pt_c[0] + llb;
if(llRes>>32 == 0)
{
/* Ajout du cast */
pt_c[0] = (unsigned int)llRes;
}
else
{
pt_c[1] = pt_c[1] + (llRes>>32); /* Ou avec l'opérateur += */
pt_c[0] = pt_c[0] + (llRes & 0x00000000FFFFFFFF);
}
}
printf("\n") ;
/* Les opérateurs >>= et <<= ne sont pas mal non plus... */
a = a>>1 ;
llb = llb<<1 ;
} while(a>0);
/* Deux entiers décimaux affichés côte-à-côte, ça ne le fait pas. */
printf("\t%08X:%08X\n", pt_c[1], pt_c[0] );
llRes = pt_c[1];
llRes <<= 32;
llRes |= pt_c[0];
//printf("\t%016llX == %llu\n", llRes, llRes);
printf("\t%016I64X == %I64u\n", llRes, llRes);
/* Dev-C++ */
system("pause");
return EXIT_SUCCESS;
}/* main */ |
Partager