Mejor respuesta
Primero, una queja: C y C ++ son dos lenguajes diferentes. La respuesta a continuación se aplica a ambos, pero a veces la respuesta difiere entre los idiomas. Y, en ambos idiomas, la expresión c/c++
tiene comportamiento indefinido.
Esta es una forma tonta de conseguir una promoción de tipo. Tenga en cuenta que el ejemplo de los detalles está formulado con mayor claridad:
int a, b;
long long l = a * 1ll * b;
Como señala el OP, el 1ll
declara un long long
literal entero.
Su La presencia aquí en el código promueve la multiplicación completa a long long
a través de las conversiones aritméticas habituales, particularmente las promociones de enteros.
La expresión se analiza como ((a * 1ll) * b)
. La primera multiplicación solo devuelve el valor de a
como long long
. La segunda multiplicación también se actualiza a long long
.
Podrías haber obtenido el mismo efecto con una conversión explícita:
int a, b;
long long l = (long long)a * b;
Es un poco más de escritura, pero solo un poco. La segunda formulación es ciertamente más clara, al menos para mí.
También podría hacer algo como:
long long l = a;
l *= b;
Pero eso empieza a volverse tonto de nuevo.
¿Por qué necesita promocionar? Si tiene valores lo suficientemente grandes, la multiplicación podría desbordarse. Al ascender a long long
, garantiza que no lo hará.
Supongamos int
de 32 bits y bit long long
, y la representación del complemento de 2. El producto más grande que puede obtener es -2 ^ {31} \ times -2 ^ {31} = 2 ^ {62}. Eso está por debajo del valor positivo más grande que puede representar, 2 ^ {63} – 1, por lo que tiene la garantía de que no se desbordará.
Respuesta
ayb son int int * int -> int (todo en el rango de 32 bits int ie -2147483648 int 2147483647) . «. 2147483647 * 2 = -2 y no 4294967294 el operador de asignación tiene asociatividad de derecha a izquierda es decir, en la expresión: long long l = a * b; a * b se calcula primero int * int-> int si a = 2147483647 y b = 2 a * b -> – 2 y no 4294967294 ahora l = -2-2 se convierte en long long y se almacena en l