diff --git a/Cython/Utility/StringTools.c b/Cython/Utility/StringTools.c
index 6505c8130d05379df14636c59f5c6bba3fbaf090..0869f8184eafe8b961cdd7af436723bff9aeafc7 100644
--- a/Cython/Utility/StringTools.c
+++ b/Cython/Utility/StringTools.c
@@ -699,9 +699,14 @@ static CYTHON_INLINE int __Pyx_PyByteArray_AppendObject(PyObject* bytearray, PyO
     } else
 #endif
     {
+        // CPython calls PyNumber_Index() internally
         ival = __Pyx_PyIndex_AsSsize_t(value);
-        if (unlikely(ival == -1 && PyErr_Occurred()))
+        if (unlikely((ival < 0) | (ival > 255))) {
+            if (ival == -1 && PyErr_Occurred())
+                return -1;
+            PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
             return -1;
+        }
     }
     return __Pyx_PyByteArray_Append(bytearray, ival);
 }