Beste svaret
Først et grep: C og C ++ er to forskjellige språk. Svaret nedenfor gjelder tilfeldigvis begge deler, men noen ganger er svaret forskjellig mellom språkene. Og på begge språk har uttrykket c/c++
udefinert oppførsel.
Dette er en goofy måte å få en type kampanje. Merk at eksemplet i detaljene er formulert tydeligere:
int a, b;
long long l = a * 1ll * b;
Som OP noterer, erklærer 1ll
et long long
heltall bokstavelig.
Dens tilstedeværelse her i koden fremmer hele multiplikasjonen til long long
gjennom vanlige aritmetiske konverteringer, spesielt heltalskampanjer.
Uttrykket analyseres som ((a * 1ll) * b)
. Den første multiplikasjonen returnerer bare verdien av a
som en long long
. Den andre multiplikasjonen oppgraderes deretter til long long
.
Du kunne ha fått den samme effekten med en eksplisitt rollebesetning:
int a, b;
long long l = (long long)a * b;
Det er litt mer å skrive, men bare litt. Den andre formuleringen er absolutt tydeligere, i det minste for meg.
Du kan også gjøre noe sånt som:
long long l = a;
l *= b;
Men det begynner å bli dumt igjen.
Når det gjelder hvorfor du trenger å promotere? Hvis du har store nok verdier, kan multiplikasjonen renne over. Ved å promotere til long long
, garanterer du at du ikke vil.
La oss anta 32-bit int
og 64- bit long long
, og 2 er komplementær representasjon. Det største produktet du kan få er -2 ^ {31} \ times -2 ^ {31} = 2 ^ {62}. Det er under den største positive verdien du kan representere, 2 ^ {63} – 1, så du er garantert at du ikke vil løpe over.
Svar
a og b er int int * int -> int (alt innen 32 bit int ie -2147483648 int 2147483647) . «. 2147483647 * 2 = -2 og ikke 4294967294 oppdragsoperatør har assosiativitet rett mot venstre dvs. i uttrykket: lang lang l = a * b; a * b beregnes første int * int-> int hvis a = 2147483647 og b = 2 a * b -> – 2 og ikke 4294967294 nå konverteres l = -2-2 til lang lang og lagres i l