Quelle est lutilisation de 1ll dans linstruction long long l = (int) a * 1ll * (int) b; en C / C ++?


Meilleure réponse

Premièrement, un reproche: C et C ++ sont deux langages différents. La réponse ci-dessous sapplique aux deux, mais parfois la réponse diffère entre les langues. Et, dans les deux langues, lexpression c/c++ a un comportement indéfini.

Il sagit dun façon loufoque dobtenir une promotion de type. Notez que lexemple dans les détails est formulé plus clairement:

int a, b;

long long l = a * 1ll * b;

Comme le note lOP, le 1ll déclare un long long littéral entier.

Cest la présence ici dans le code favorise la multiplication entière en long long via les conversions arithmétiques habituelles, en particulier les promotions entières.

Lexpression est analysée comme ((a * 1ll) * b). La première multiplication renvoie simplement la valeur de a sous forme de long long. La deuxième multiplication passe également à long long.

Vous auriez pu obtenir le même effet avec une distribution explicite:

int a, b;

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

Cest un peu plus typé, mais seulement légèrement. La deuxième formulation est certainement plus claire, du moins pour moi.

Vous pouvez également faire quelque chose comme:

long long l = a;

l *= b;

Mais cela recommence à devenir ridicule.

Pourquoi avez-vous besoin de promouvoir? Si vous avez des valeurs suffisamment grandes, la multiplication pourrait déborder. En faisant la promotion en long long, vous garantissez que vous ne le ferez pas.

Supposons que 32 bits int et 64- bit long long, et représentation complémentaire de 2. Le plus grand produit que vous pouvez obtenir est -2 ^ {31} \ times -2 ^ {31} = 2 ^ {62}. Cest en dessous de la plus grande valeur positive que vous pouvez représenter, 2 ^ {63} – 1, vous êtes donc assuré de ne pas déborder.

Réponse

a et b sont des entiers int * int -> int (tout dans la plage de 32 bits int ie -2147483648 int 2147483647) . « . 2147483647 * 2 = -2 et non 4294967294 l’opérateur d’affectation a une associativité de droite à gauche ie dans l’expression: long long l = a * b; a * b est calculé dabord int * int-> int si a = 2147483647 et b = 2 a * b -> – 2 et non 4294967294 maintenant l = -2 -2 est converti en long long et stocké dans l

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *