¿Cuál es el uso de 1ll en la declaración long long l = (int) a * 1ll * (int) b; en C / C ++?


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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *