diff --git a/src/core/support/string.c b/src/core/support/string.c
index ed000e337243ffc567968189d51d00802a996a5d..46a7ca3d462fca16f47210db6313139ed09b9b73 100644
--- a/src/core/support/string.c
+++ b/src/core/support/string.c
@@ -153,9 +153,8 @@ void gpr_reverse_bytes(char *str, int len) {
 }
 
 int gpr_ltoa(long value, char *string) {
-  unsigned long uval;
+  long sign;
   int i = 0;
-  int neg = value < 0;
 
   if (value == 0) {
     string[0] = '0';
@@ -163,25 +162,20 @@ int gpr_ltoa(long value, char *string) {
     return 1;
   }
 
-  if (neg) {
-    uval = (unsigned long)-value;
-  } else {
-    uval = (unsigned long)value;
+  sign = value < 0 ? -1 : 1;
+  while (value) {
+    string[i++] = (char)('0' + sign * (value % 10));
+    value /= 10;
   }
-  while (uval) {
-    string[i++] = (char)('0' + uval % 10);
-    uval /= 10;
-  }
-  if (neg) string[i++] = '-';
+  if (sign < 0) string[i++] = '-';
   gpr_reverse_bytes(string, i);
   string[i] = 0;
   return i;
 }
 
 int gpr_int64toa(gpr_int64 value, char *string) {
-  gpr_uint64 uval;
+  gpr_int64 sign;
   int i = 0;
-  int neg = value < 0;
 
   if (value == 0) {
     string[0] = '0';
@@ -189,16 +183,12 @@ int gpr_int64toa(gpr_int64 value, char *string) {
     return 1;
   }
 
-  if (neg) {
-    uval = (gpr_uint64)-value;
-  } else {
-    uval = (gpr_uint64)value;
-  }
-  while (uval) {
-    string[i++] = (char)('0' + uval % 10);
-    uval /= 10;
+  sign = value < 0 ? -1 : 1;
+  while (value) {
+    string[i++] = (char)('0' + sign * (value % 10));
+    value /= 10;
   }
-  if (neg) string[i++] = '-';
+  if (sign < 0) string[i++] = '-';
   gpr_reverse_bytes(string, i);
   string[i] = 0;
   return i;