diff --git a/sys/fmt/fmt.c b/sys/fmt/fmt.c index df79a40f4e50a5c377c9e6d86cdc8832e0e23b1f..1e70126931c596497c2ccc3a1014d8ddfe2407f1 100644 --- a/sys/fmt/fmt.c +++ b/sys/fmt/fmt.c @@ -265,25 +265,33 @@ size_t fmt_u16_dec(char *out, uint16_t val) size_t fmt_s64_dec(char *out, int64_t val) { unsigned negative = (val < 0); + uint64_t sval; if (negative) { if (out) { *out++ = '-'; } - val = -val; + sval = -(uint64_t)(val); } - return fmt_u64_dec(out, val) + negative; + else { + sval = +(uint64_t)(val); + } + return fmt_u64_dec(out, sval) + negative; } size_t fmt_s32_dec(char *out, int32_t val) { unsigned negative = (val < 0); + uint32_t sval; if (negative) { if (out) { *out++ = '-'; } - val = -val; + sval = -((uint32_t)(val)); + } + else { + sval = +((uint32_t)(val)); } - return fmt_u32_dec(out, val) + negative; + return fmt_u32_dec(out, sval) + negative; } size_t fmt_s16_dec(char *out, int16_t val)