Migliore risposta
Primo, una lamentela: C e C ++ sono due linguaggi diversi. La risposta di seguito si applica a entrambi, ma a volte la risposta differisce tra le lingue. Inoltre, in entrambe le lingue, lespressione c/c++
ha comportamento indefinito.
Questo è un modo sciocco per ottenere una promozione di tipo. Tieni presente che lesempio nei dettagli è formulato in modo più chiaro:
int a, b;
long long l = a * 1ll * b;
Come nota lOP, 1ll
dichiara un long long
intero letterale.
Il suo la presenza qui nel codice promuove lintera moltiplicazione a long long
tramite le conversioni aritmetiche usuali, in particolare le promozioni intere.
Lespressione viene analizzata come ((a * 1ll) * b)
. La prima moltiplicazione restituisce semplicemente il valore di a
come long long
. La seconda moltiplicazione viene quindi aggiornata a long long
.
Avresti potuto ottenere lo stesso effetto con un cast esplicito:
int a, b;
long long l = (long long)a * b;
È leggermente più digitato, ma solo leggermente. La seconda formulazione è certamente più chiara, almeno per me.
Potresti anche fare qualcosa del tipo:
long long l = a;
l *= b;
Ma sta cominciando a diventare di nuovo stupido.
Per quanto riguarda il motivo per cui hai bisogno di promuovere? Se hai valori abbastanza grandi, la moltiplicazione potrebbe traboccare. Promuovendo long long
, garantisci che non lo farai.
Supponiamo che int
a 32 bit e 64- bit long long
e rappresentazione in complemento a 2. Il prodotto più grande che puoi ottenere è -2 ^ {31} \ times -2 ^ {31} = 2 ^ {62}. È al di sotto del valore positivo più grande che puoi rappresentare, 2 ^ {63} – 1, quindi hai la certezza di non traboccare.
Risposta
aeb sono int int * int -> int (tutto nellintervallo di 32 bit int ie -2147483648 int 2147483647) . “. 2147483647 * 2 = -2 e non 4294967294 Loperatore di assegnazione ha associatività da destra a sinistra , ad esempio nellespressione: long long l = a * b; a * b viene calcolato prima int * int-> int se a = 2147483647 eb = 2 a * b -> – 2 e non 4294967294 ora l = -2-2 viene convertito in long long e memorizzato in l