2017-02-22 4 views
2

Ich lese, dass die Umwandlung von int zu long long int Förderung ist und daher dachte, dass es kein Problem geben sollte, da es keinen Datenverlust gibt, im Gegensatz zur umgekehrten Konvertierung.Warum gibt die implizite Konvertierung von int in long long int unerwartete Antworten in C++?

Aber wenn ich zwei int s großen Wert multipliziere und es in long long int speichern, zeigt es mir negative Zahl.

ZB:

int a=1000000, b=1000000; 
long long int c=a*b; 
cout<<c; 

Der obige Code gibt mir einen negativen Wert. Kann jemand erklären warum?

+1

Das ist, weil Sie INTS verwenden, um eine Operation zu machen, die zu einem Rückgabewert führt, der auch ein Int ist, der möglicherweise überläuft, und dann haben Sie die Förderung, die bereits zu spät ist. –

+0

Ich habe das gleiche mit C versucht, wo ich den Platzhalter "% lld" in printf zum Drucken verwendet habe. Selbst dann zeigt es mir einen negativen Wert. – Bharg

+2

möglicherweise ein Duplikat http://stackoverflow.com/questions/31662792/multiplication-of-two-integers-in-c – Ap31

Antwort

5

Die Vermehrung geschieht als int, die überläuft, Undefined Behaviour geben (in diesem Fall Überlauf, der ganz normal ist - Ihre Kombination aus Compiler + Einstellungen es garantieren können sogar) und nach diesen das Ergebnis umgewandelt wird zu long long.

Ich denke, Sie die Konvertierung auf eines der Argumente tun wollen vor Multiplikation, so dass die Multiplikation durchgeführt wird long long s:

long long c = static_cast<long long>(a)*b; 

Auf diese Weise wird b-long long gefördert werden, bevor Die Multiplikation findet statt und die gesamte Operation wird sicher und mit dem gewünschten Ergebnis ausgeführt.

+0

Überläufe geben undefiniertes Verhalten? –

+3

@Adrian Lis für vorzeichenbehaftete ganze Zahlen, ja – Ap31

+1

Sie ist für 'unsigned int' definiert, aber nicht für signed. – BoBTFish

7

a*b ist immer noch vom Typ int. Nach der Auswertung wird das Ergebnis und dann in long long int umgewandelt. Zu diesem Zeitpunkt ist es zu spät, um Überlauf zu vermeiden. Konvertieren Sie einen Ihrer Werte in long long int, bevor Sie die Multiplikation durchführen. Versuchen Sie folgendes:

#include <iostream> 
using std::cout; 
int main() 
{ 
    int a = 1000000, b = 1000000; 
    long long int c = static_cast<long long int>(a)*b; 
    cout << c; 
    return 0; 
}; 
0

Da die Multiplikation zweier int s in einem anderen int führen wird, die angebracht mit allen Überlaufprobleme kommt. Diese int ist dann (nach der Tat) zu einem long long int befördert, was immer noch bedeutet, dass es nicht das ist, was Sie wollen.

Bewerben Sie mindestens einen der Operanden, um den anderen zu promoten und das gewünschte Ergebnis zu erhalten.

Verwandte Themen