update comment

This commit is contained in:
Neutron3529 2022-11-04 15:37:33 +08:00 committed by GitHub
parent aafe6db079
commit d81a0e9e2d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 8 additions and 4 deletions

View File

@ -2068,10 +2068,14 @@ macro_rules! int_impl {
pub const fn rem_euclid(self, rhs: Self) -> Self {
let r = self % rhs;
if r < 0 {
// if rhs is `integer::MIN`, rhs.wrapping_abs() == rhs.wrapping_abs,
// thus r.wrapping_add(rhs.wrapping_abs()) == r.wrapping_add(rhs) == r - rhs,
// which suits our need.
// otherwise, rhs.wrapping_abs() == -rhs, which won't overflow since r is negative.
// Semantically equivalent to `if rhs < 0 { r - rhs } else { r + rhs }`.
// If `rhs` is not `Self::MIN`, then `r + abs(rhs)` will not overflow
// and is clearly equivalent, because `r` is negative.
// Otherwise, `rhs` is `Self::MIN`, then we have
// `r.wrapping_add(Self::MIN.wrapping_abs())`, which evaluates
// to `r.wrapping_add(Self::MIN)`, which is equivalent to
// `r - Self::MIN`, which is what we wanted (and will not overflow
// for negative `r`).
r.wrapping_add(rhs.wrapping_abs())
} else {
r