2011-04-11 6 views
1
unsigned__int64 difference; 
difference=(64*33554432); 
printf ("size %I64u \n", difference); 
difference=(63*33554432); 
printf ("size %I64u \n", difference); 

le premier # est ridiculement grand. Le deuxième nombre est la bonne réponse. Comment le passage de 62 à 63 provoque-t-il un tel changement?Comportement inattendu de unsigned_int64;

La première valeur est 18446744071562067968 La seconde valeur est 2113929216

Désolé les valeurs étaient 64 et 63, pas 63 et 62.

+1

Pourriez-vous ajouter les résultats que vous voyez? Pourriez-vous également poster votre code * réel *? (Cela ne peut pas être le cas, car il n'y a pas de différence3). –

+0

Oups, Le code est très simple .. Je veux dire évidemment différence pas différence3 désolé – Jake

+0

C++ n'a pas 'unsigned__int64'. Vous utilisez une extension spécifique à l'implémentation ou une bibliothèque. Énoncez votre plateforme. –

Répondre

10

moins d'indication contraire, les littéraux entiers sont de type int. Je suppose que sur la plate-forme où vous êtes, un int est de 32 bits. Donc le calcul (64*33554432) déborde et devient négatif. Vous le transtypez ensuite en unsigned __int64, ce qui le ramène maintenant à un très grand nombre entier positif.

Voila:

int main() 
{ 
    int a1 = (64*33554432); 
    int a2 = (63*33554432); 

    printf("%08x\n", a1); // 80000000 (negative) 
    printf("%08x\n", a2); // 7e000000 (positive) 

    unsigned __int64 b1 = a1; 
    unsigned __int64 b2 = a2; 

    printf("%016llx\n", b1); // ffffffff80000000 
    printf("%016llx\n", b2); // 000000007e000000 
} 
+0

@Matt: C'est exactement ce que je suggère. –

0

Sur gcc il fonctionne très bien et donne le nombre correct dans les deux cas.

taille 2113929216 taille 2080374784

Serait-ce un bug avec printf? Utilisez-vous MSVC ou similaire? essayez de passer à travers le débogueur et d'inspecter la différence après chaque évaluation. Si les chiffres semblent juste là, il se peut que ce soit juste un problème de printf. Cependant, sous gcc sur Linux, c'est correct.

+0

désolé les valeurs étaient erronées ... pouvez-vous l'essayer avec 64 et 63? – Jake