Die Quadrierung einer Zahl in C ++ ergibt einen falschen Wert

7

Wenn ich das tue

%Vor%

dann x == 1410065408

1410065408 ist 2 ^ 31, aber ich erwarte, dass x 64 Bit ist

Was ist los?  Ich benutze VSC ++ (Standard VS C ++ Compiler)

    
Hristo 23.07.2016, 17:33
quelle

3 Antworten

22

n*n ist zu groß für int , weil es gleich 10^10 ist. Das (fehlerhafte) Ergebnis wird als long long gespeichert.

Versuchen Sie:

%Vor%

Hier ist eine Antwort, die auf den Standard verweist , die angibt, dass die Operation long long x = (long long)n*n , wo n ein int-Wille ist verursacht keinen Datenverlust. Insbesondere

  

Wenn beide Operanden vorzeichenbehaftete Integer-Typen haben oder beide vorzeichenlose Integertypen haben, wird der Operand mit dem Typ des ganzzahligen Konvertierungsrangs in den Typ des Operanden mit größerem Rang konvertiert.

Da der funktionale Cast hier die höchste Priorität hat, konvertiert er den linken Multiplikanden in ein long long . Der richtige Multiplikand vom Typ int wird nach dem Standard in ein long long konvertiert. Es tritt kein Verlust auf.

    
Jossie Calderon 23.07.2016, 17:35
quelle
3

Die Angabe von n als Long Long ist die beste Lösung, wie bereits erwähnt.

Genau wie eine schnelle Erläuterung zum ursprünglichen Post, 1410065408 ist nicht 2 ^ 31, kommt der Wert wie folgt zustande:

100.000 ^ 2 = 10.000.000.000, die in binärer Form als:

existiert

10 0101 0100 0000 1011 1110 0100 0000 0000

C ++ Ganzzahlen sind streng 32 Bits im Speicher. Daher werden die vorderen zwei Bits ignoriert und der Wert wird im Speicher als binär gespeichert:

0101 0100 0000 1011 1110 0100 0000 0000

Im Dezimalformat entspricht dies genau 1410065408.

    
Dan 24.07.2016 03:54
quelle
2

Bearbeiten - Dies ist eine weitere Lösung für das Problem. was dies tun wird, ist die Umwandlung der Integer-Werte lange vor der Multiplikation, so dass Sie keine abgeschnittenen Bits erhalten.

Ursprüngliche Posting

%Vor%

Bearbeiten - Die ursprüngliche Antwort von Jossie Calderon wurde bereits als gültige Antwort akzeptiert und diese Antwort fügt eine weitere gültige Lösung hinzu.

    
Francis Cugler 23.07.2016 18:04
quelle

Tags und Links