diff --git a/py/objint.c b/py/objint.c
index 4801baa85e644e1c6024bc01ce2343c4b2d68d67..0b490413993dc975448d8a3711135e70d99aae18 100644
--- a/py/objint.c
+++ b/py/objint.c
@@ -435,7 +435,10 @@ STATIC mp_obj_t int_to_bytes(size_t n_args, const mp_obj_t *args) {
     // TODO: Support signed param (assumes signed=False)
     (void)n_args;
 
-    mp_uint_t len = MP_OBJ_SMALL_INT_VALUE(args[1]);
+    mp_int_t len = mp_obj_get_int(args[1]);
+    if (len < 0) {
+        mp_raise_ValueError(NULL);
+    }
     bool big_endian = args[2] != MP_OBJ_NEW_QSTR(MP_QSTR_little);
 
     vstr_t vstr;
diff --git a/tests/basics/int_bytes.py b/tests/basics/int_bytes.py
index 5198792625116f9f5b437f3e76ed3a98cd391a17..d1837ea75ca4a8bcaa8f9ca6f17e83eb62e2b7bb 100644
--- a/tests/basics/int_bytes.py
+++ b/tests/basics/int_bytes.py
@@ -14,3 +14,9 @@ print((10).to_bytes(1, "big"))
 print((100).to_bytes(10, "big"))
 print(int.from_bytes(b"\0\0\0\0\0\0\0\0\0\x01", "big"))
 print(int.from_bytes(b"\x01\0", "big"))
+
+# negative number of bytes should raise an error
+try:
+    (1).to_bytes(-1, "little")
+except ValueError:
+    print("ValueError")