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)