A cosa serve 1ll nellistruzione long long l = (int) a * 1ll * (int) b; in C / C ++?


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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *