2017-08-26 6 views
0

Wie die Frage selbst sagt - bitweise links Operator gibt falsche Antwort. mein Code ist hier -Warum gibt die bitweise linke Operation eine falsche Antwort?

#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 

Kann mir jemand erklären, warum dies geschieht? Vielen Dank im Voraus

+3

Schalten Sie Warnungen gearbeitet haben. –

+1

@ T.C. Hinzufügen, dass es immer eine gute Übung ist, die Option "-Wall" zu verwenden. – iBug

Antwort

5

1<<60; mit int Typen ausgewertet, und IhrFormal beobachtete Ergebnis steht im Einklang mit dem Bereich der int auf Ihrer Plattform überfüllt. (Die Tatsache, dass dieser Ausdruck einem unsigned long long zugewiesen ist, ist nicht relevant.)

Fix mit 1ULL << 60, um entsprechende Argument-Promotion zu erzwingen.

Hat Ihr Compiler Sie nicht davor gewarnt? Wenn nicht, dann erhöhen Sie die Warnstufe.

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

Daher Überlauf.

+2

'sizeof (int) == 4'; ist oft der Fall, aber nicht unbedingt wahr. – Bathsheba

+0

@Bathsheba Bearbeitet als '__int32' –

+2

Aber ich sehe nicht, warum '__int32' relevant ist. Es ist nicht im Standard angegeben. '2' und' 60' sind 'int' Literale in C. Sie können die Details aus meiner Antwort ausleihen, um dies zu korrigieren. – Bathsheba

0

1 ist ein konstantes Literal, dessen Standardtyp "int" ist, also 32 Bit (normalerweise). Siehe c++ constant literal types Formular mehr Details.

, wenn Sie getan hätte ((long long)1) << 60 es sollte

Verwandte Themen