La aritmética en Rust ofrece diferentes modos para manejar potenciales situaciones de desbordamiento (overflow), que ocurren cuando una operación produce un resultado demasiado grande para caber en el tipo de dato destino. Por defecto, el comportamiento de Rust para tipos enteros depende del modo de compilación: provoca un pánico (panic) en modo de depuración (debug) y “envuelve” (wraps) en modo de liberación (release).
Para proporcionar un control explícito y consistente sobre el desbordamiento, Rust ofrece métodos específicos para las operaciones aritméticas, que se resumen a continuación:
Métodos: checked_add(), checked_sub(), checked_mul(), etc.
Comportamiento: Realiza la operación y devuelve un Option<T>:
Some(resultado): si la operación no se desborda.
None: si la operación sí se desborda.
Caso de uso: Ideal cuando se necesita detectar explícitamente el desbordamiento y manejarlo de manera elegante sin provocar un pánico, a menudo devolviendo un error o usando un valor predeterminado (a través de métodos como unwrap_or).
Métodos: overflowing_add(), overflowing_sub(), overflowing_mul(), etc.
Comportamiento: Realiza la operación y devuelve una tupla (T, bool):
T) es el resultado, posiblemente envuelto en caso de que haya habido un desbordamiento.
bool) es true si efectivamente ocurrió un desbordamiento y false en caso contrario.
Caso de uso: Útil cuando el resultado envuelto es aceptable pero se quiere saber si la operación realmente se desbordó. Esto refleja el comportamiento de la aritmética de complemento a dos en muchos lenguajes de programación.
Métodos: saturating_add(), saturating_sub(), saturating_mul(), etc.
Comportamiento: Cuando ocurre un desbordamiento, el resultado se satura al valor máximo o mínimo del tipo.
T::MAX).
T::MIN).
Caso de uso: Común en gráficos, procesamiento de audio y cálculos financieros donde los valores no deben envolverse sino quedarse en el límite del tipo de dato.
Métodos: wrapping_add(), wrapping_sub(), wrapping_mul(), etc.
Comportamiento: El resultado se envuelve silenciosamente sin indicar que ha ocurrido un desbordamiento. Este es el mismo comportamiento que la aritmética por defecto en las compilaciones de liberación (release) de Rust, pero de manera explícita.
Caso de uso: Útil para implementaciones de tablas hash, búferes circulares o al implementar aritmética modular donde el comportamiento de envoltura (wraparound) es el comportamiento deseado.