Mitä 1ll: n käyttö lauseessa pitkä pitkä l = (int) a * 1ll * (int) b; kielellä C / C ++?


Paras vastaus

Ensinnäkin, grippi: C ja C ++ ovat kaksi eri kieltä. Alla oleva vastaus sattuu koskemaan molempia, mutta joskus vastaus vaihtelee kielillä. Ja lausekkeella c/c++ on molemmilla kielillä -käyttäytymistä määrittelemätön.

Tämä on hieno tapa saada tyyppikampanja. Huomaa, että yksityiskohtainen esimerkki on muotoiltu selkeämmin:

int a, b;

long long l = a * 1ll * b;

Kuten OP huomauttaa, 1ll julistaa long long kokonaisluvun kirjaimeksi.

Sen läsnäolo tässä koodissa edistää koko kertolukua long long -näppäimillä tavallisten aritmeettisten muunnosten , erityisesti kokonaislukukampanjat.

Lauseke jäsennetään muodossa ((a * 1ll) * b). Ensimmäinen kertolasku palauttaa arvon a vain arvona long long. Toinen kertolasku päivitetään sitten muotoon long long.

Olisit voinut saada saman vaikutuksen nimenomaisella näyttelijällä:

int a, b;

long long l = (long long)a * b;

Se kirjoittaa hieman enemmän, mutta vain vähän. Toinen muotoilu on varmasti selkeämpi, ainakin minulle.

Voit tehdä myös jotain seuraavista:

long long l = a;

l *= b;

Mutta se alkaa taas olla typerää.

Mitä sinun tulee mainostaa? Jos sinulla on tarpeeksi suuria arvoja, kertolasku voi ylittyä. Edistämällä tuotteeksi long long varmistat, ettet tule.

Oletetaan, että 32-bittisiä int ja bitti long long ja 2: n komplementtiesitys. Suurin tuote, jonka saat, on -2 ^ {31} \ kertaa -2 ^ {31} = 2 ^ {62}. Se on alle suurimman positiivisen arvon, jota voit edustaa, 2 ^ {63} – 1, joten et ole varma, ettet tule yli.

Vastaa

a ja b ovat int int * int -> int (kaikki 32-bittisen int-alueella eli -2147483648 int 2147483647) . ”. 2147483647 * 2 = -2 eikä 4294967294 määritysoperaattorilla on assosiatiivisuus oikealta vasemmalle eli lausekkeessa: pitkä pitkä l = a * b; a * b lasketaan ensin int * int-> int, jos a = 2147483647 ja b = 2 a * b -> – 2 eikä 4294967294 nyt l = -2 -2 muunnetaan pitkäksi pitkäksi ja säilytetään litroina

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *