diff --git a/sexp-format.c b/sexp-format.c
index d445f0342ad87d14d2a5a8004515dbd54413f23c..217ead315acd4f256b86d25ead2b2794ccc982e1 100644
--- a/sexp-format.c
+++ b/sexp-format.c
@@ -177,15 +177,17 @@ sexp_vformat(struct nettle_buffer *buffer, const char *format, va_list args)
 	      uint32_t x = va_arg(args, uint32_t);
 	      unsigned length;
 	      
-	      if (x < 0x100)
+	      if (x < 0x80)
 		length = 1;
-	      else if (x < 0x10000L)
+	      else if (x < 0x8000L)
 		length = 2;
-	      else if (x < 0x1000000L)
+	      else if (x < 0x800000L)
 		length = 3;
-	      else
+	      else if (x < 0x80000000L)
 		length = 4;
-
+	      else
+		length = 5;
+	      
 	      if (buffer && !(NETTLE_BUFFER_PUTC(buffer, '0' + length)
 			      && NETTLE_BUFFER_PUTC(buffer, ':')))
 		return 0;
@@ -195,6 +197,11 @@ sexp_vformat(struct nettle_buffer *buffer, const char *format, va_list args)
 	      if (buffer)
 		switch(length)
 		{
+		case 5:
+		  /* Leading byte needed for the sign. */
+		  if (!NETTLE_BUFFER_PUTC(buffer, 0))
+		    return 0;
+		  /* Fall through */
 		case 4:
 		  if (!NETTLE_BUFFER_PUTC(buffer, x >> 24))
 		    return 0;
@@ -223,9 +230,7 @@ sexp_vformat(struct nettle_buffer *buffer, const char *format, va_list args)
 	      unsigned length;
 	      unsigned prefix_length;
 	      
-	      assert(mpz_sgn(n) >= 0);
-
-	      length = nettle_mpz_sizeinbase_256(n);
+	      length = nettle_mpz_sizeinbase_256_s(n);
 	      prefix_length = format_prefix(buffer, length);
 	      if (!prefix_length)
 		return 0;