2017-08-26 3 views
0

Comme la question elle-même dit - opérateur à gauche bit à bit donne une mauvaise réponse. Voici mon code -Pourquoi l'opération gauche au niveau du bit donne-t-elle une mauvaise réponse?

#include <iostream> 
#include<cmath> 
using namespace std; 

int main() { 
    unsigned long long int a,b; 
    a=pow(2,60); 
    b=1<<60; 
    cout<<a<<endl<<b<<endl; 
    return 0; 
} 


Output - 
1152921504606846976 
0 

Quelqu'un peut-il expliquer pourquoi cela se produit? Merci à l'avance

+3

Allumez les avertissements. –

+1

@ T.C. Ajoutant que c'est toujours une bonne pratique d'utiliser l'option '-Wall'. – iBug

Répondre

5

1<<60; est évaluée avec int types, et le résultat observé est cohérent avec votre déborde la portée de la int sur votre plate-forme. (Le fait que cette expression soit affectée à un unsigned long long n'est pas pertinent.)

Correction avec 1ULL << 60 pour forcer la promotion des arguments appropriés.

Votre compilateur n'a pas essayé de vous en avertir? Si ce n'est pas le cas, augmentez le niveau d'avertissement.

0
sizeof(__int32) == 4 
60/8 == 7 
7 > 4 

Par conséquent, trop-plein.

+2

'sizeof (int) == 4'; est souvent le cas mais n'est pas nécessairement vrai. – Bathsheba

+0

@Bathsheba Edité comme '__int32' –

+2

Mais je ne vois pas pourquoi '__int32' est pertinent. Ce n'est pas spécifié dans la norme. '2' et' 60' sont des littéraux 'int' en C. N'hésitez pas à emprunter les détails de ma réponse pour corriger cela. – Bathsheba

0

1 est un littéral constant dont le type par défaut est "int" qui est de 32 bits (habituellement). Voir c++ constant literal types formulaire plus de détails.

si vous auriez fait ((long long)1) << 60 il aurait travaillé