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.
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:
existiert10 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.
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.
Tags und Links c++