Integer Overflow
February 24, 20252 minutes
¿Por qué 4294967295 + 1 es 0? En este post lo descubrirás....

Se puede usar este script para poner en práctica la explicación
/*gcc main.c -o main*/
#include <stdio.h>
int main() {
int a, b, result;
printf("> ");
scanf("%d %d", &a, &b);
result = a + b;
printf("%d + %d = %d\n", a, b, result);
return 0;
}
Los números (int) en c se guardan en registros de 32bits Sabiendo esto se puede sacar la conclusión de que el número más grande que se puede poner es 2147483647, ya que en binario 2147483647 son 31 ‘1’ y el último bit es un 0, ya que es un número positivo.
>>> n = 2147483647
>>> b = format(n, 'b')
>>> print(f"{len(b)} - {b}")
31 - 1111111111111111111111111111111
Siguiendo con esto el número más pequeño que se puede poner es -2147483648 ya que en binario -2147483648 es un ‘1’ indicando qué es negativo seguido de 31 ‘0’
>>> n = 2147483648
>>> b = format(n, 'b')
>>> print(f"{len(b)} - {b}")
32 - 10000000000000000000000000000000
El problema surge cuando se introduce un número muy largo que ocupa más de 32 bits
[d3bo@archlinux integer_overflow]$ ./main
> 5000000000 0
705032704 + 0 = 705032704
Se ha introducido el número 5000000000, pero el programa lo ha almacenado como 705032704
¿Por qué?
El número 5000000000 en binario es 100101010000001011111001000000000 y ocupa 33 bits por lo que no se puede almacenar entero entonces el programa lo corta
>>> n = 5000000000
>>> b = format(n, 'b')
>>> print(f"{len(b)} - {b}")
33 - 100101010000001011111001000000000
>>> print(f"{len(b[-32:])} - {b[-32:]}")
32 - 00101010000001011111001000000000
Al cortar 100101010000001011111001000000000 para que ocupe 32 bits queda el número 00101010000001011111001000000000 que en decimal es 705032704
>>> print(int(b[-32:], 2))
705032704