diff --git a/src/core/support/cpu_linux.c b/src/core/support/cpu_linux.c
index a748d43cf05187870837b65600c978d2c5891cf2..b59d013e92c76926ee0cb669b24706e45a2c5311 100644
--- a/src/core/support/cpu_linux.c
+++ b/src/core/support/cpu_linux.c
@@ -48,10 +48,11 @@
 #include <grpc/support/log.h>
 #include <grpc/support/sync.h>
 
-static unsigned ncpus = 0;
+static int ncpus = 0;
 
 static void init_num_cpus() {
-  ncpus = (unsigned)sysconf(_SC_NPROCESSORS_ONLN);
+  // This must be signed. sysconf returns -1 when the number can't be determined
+  ncpus = (int)sysconf(_SC_NPROCESSORS_ONLN);
   if (ncpus < 1) {
     gpr_log(GPR_ERROR, "Cannot determine number of CPUs: assuming 1");
     ncpus = 1;
@@ -61,7 +62,7 @@ static void init_num_cpus() {
 unsigned gpr_cpu_num_cores(void) {
   static gpr_once once = GPR_ONCE_INIT;
   gpr_once_init(&once, init_num_cpus);
-  return ncpus;
+  return (unsigned)ncpus;
 }
 
 unsigned gpr_cpu_current_cpu(void) {