Risolto Stampare numeri molto grandi in cpp

ByteMurderer

Utente Iron
6 Maggio 2023
43
14
1
18
Salve a tutti, oggi stavo provando a fare dei problemini in cpp in uno di questi tra le tante funzionalita di una classe vi era quella di calcolare il volume di un cubo. Ecco qui il mio codice:

C++:
#include <iostream>

using namespace std;

long long a(int a, int b, int c){
    return a*b*c;
}

int main()
{

    cout << a(1039, 3749, 8473 ) << endl;
    return 0;
}

(Questo non è il codice vero è proprio, qua lo ho replicato tramite una funzione senza usare classi)

Se provo a stampare il volume di un cubo usando queste dimensioni (1039, 3749, 8473 ) il programma mi stampa questo numero: -1355615565.
Perchè? In teoria il long long int dovrebbe essere abbastanza grande per supportare il numero giusto che è 33.004.122.803. Qualcuno saprebbe aiutarmi?
 
Ciao, il problema è che a, b e c sono di tipo int, quindi il prodotto a*b*c verrà calcolato utilizzando il suddetto tipo causando quindi un overflow, e solo alla fine avverrà il cast verso long long, ossia il tipo ritornato dalla funzione, ma a questo punto poco cambia visto che "il danno" è già stato fatto.
In ogni caso puoi risolvere semplicemente sfruttando un cast esplicito e tenendo conto dell'associatività da sinistra a destra dell'operatore moltiplicazione:

C++:
#include <iostream>

using namespace std;

long long fun(int a, int b, int c)
{
    return (long long)a * b * c;
}

int main()
{
    cout << fun(1039, 3749, 8473) << endl;
}
 
Ciao, il problema è che a, b e c sono di tipo int, quindi il prodotto a*b*c verrà calcolato utilizzando il suddetto tipo causando quindi un overflow, e solo alla fine avverrà il cast verso long long, ossia il tipo ritornato dalla funzione, ma a questo punto poco cambia visto che "il danno" è già stato fatto.
In ogni caso puoi risolvere semplicemente sfruttando un cast esplicito e tenendo conto dell'associatività da sinistra a destra dell'operatore moltiplicazione:

C++:
#include <iostream>

using namespace std;

long long fun(int a, int b, int c)
{
    return (long long)a * b * c;
}

int main()
{
    cout << fun(1039, 3749, 8473) << endl;
}
Grazie mille per la risposta, non ci avevo pensato