Estaba aprendiendo arquitectura de computadoras y decidí experimentar con el desbordamiento de la multiplicación. Se observa un desbordamiento para INT_MAX * INT_MAX , pero no estoy seguro de por qué esto da el producto 1 en C/C++.
#include <stdio.h> #include <limits.h> int main() { int num = INT_MAX; printf("%0x\n", num); //stdout is 0x7fffffff printf("%d\n", num * num); //stdout is 1 return 0; }Nota: su código no es válido. El desbordamiento de int * int es un comportamiento indefinido y no debe escribir dicho código. El resultado será impredecible. Este es un ejemplo de juguete en el que un compilador elige actuar de una manera específica, pero en general, el compilador puede hacer cualquier cosa con su código. Si desea que se defina el desbordamiento firmado, consulte, por ejemplo, ¿El desbordamiento firmado sigue siendo un comportamiento indefinido en gcc cuando se usa -fwrapv? .
Por ejemplo, supongamos que int en su plataforma tiene 32 bits y es complemento a dos . El resultado se calcula y luego se trunca a 32 bits.
INT_MAX = 0x7fffffff = 2147483647 2147483647 * 2147483647 = 4611686014132420609 4611686014132420609 = 0x3fffffff00000001 32-bits from 0x3fffffff00000001 = 0x00000001 = 1En diferentes máquinas, el tamaño del tipo de datos "int" puede ser diferente. Puede ser de 32 bits o de 64 bits, según el equipo que utilice. Los rangos típicos de "int" para programas de 32 bits son de -2^31 (mínimo) a 2^31-1 (máximo). Los rangos típicos de "int" para programas de 64 bits son de -2^63 (mínimo) a 2^63-1 (máximo).
Si su programa es de 32 bits, el resultado es (2^31-1) (2^31-1) = 2^62-2^32+1. Dado que 2^62-2^32 solo se representará en los 32 bits superiores del resultado binario, el resultado de desbordamiento que obtendrá es 1. De lo contrario, si su programa es de 64 bits, entonces (2^63-1) (2^ 63-1) = 2^126-2^64+1 también conducirá al mismo resultado al truncar los 64 bits superiores.