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