Hva er bruken av 1ll i setningen lang lang l = (int) a * 1ll * (int) b; i C / C ++?


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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *