diff --git a/src/uucore/src/lib/features/format/num_format.rs b/src/uucore/src/lib/features/format/num_format.rs index b1c9172d0..b636744df 100644 --- a/src/uucore/src/lib/features/format/num_format.rs +++ b/src/uucore/src/lib/features/format/num_format.rs @@ -80,10 +80,12 @@ pub struct SignedInt { impl Formatter for SignedInt { fn fmt(&self, writer: impl Write, x: i64) -> std::io::Result<()> { + // -i64::MIN is actually 1 larger than i64::MAX, so we need to cast to i128 first. + let abs = (x as i128).abs(); let s = if self.precision > 0 { - format!("{:0>width$}", x.abs(), width = self.precision) + format!("{:0>width$}", abs, width = self.precision) } else { - x.abs().to_string() + abs.to_string() }; let sign_indicator = get_sign_indicator(self.positive_sign, x.is_negative()); @@ -1046,6 +1048,8 @@ mod test { let format = Format::::parse("%d").unwrap(); assert_eq!(fmt(&format, 123i64), "123"); assert_eq!(fmt(&format, -123i64), "-123"); + assert_eq!(fmt(&format, i64::MAX), "9223372036854775807"); + assert_eq!(fmt(&format, i64::MIN), "-9223372036854775808"); let format = Format::::parse("%i").unwrap(); assert_eq!(fmt(&format, 123i64), "123");