diff --git a/src/json.hpp b/src/json.hpp
index 65ced730..80b67710 100644
--- a/src/json.hpp
+++ b/src/json.hpp
@@ -757,7 +757,7 @@ class basic_json
         /// assignment
         type_data_t& operator=(value_t rhs)
         {
-            bits.type = static_cast<uint16_t>(rhs);
+            bits.type = static_cast<uint16_t>(rhs) & 15; // avoid overflow
             return *this;
         }
 
@@ -765,7 +765,7 @@ class basic_json
         type_data_t(value_t t) noexcept
         {
             *reinterpret_cast<uint16_t*>(this) = 0;
-            bits.type = static_cast<uint16_t>(t);
+            bits.type = static_cast<uint16_t>(t) & 15; // avoid overflow
         }
 
         /// default constructor
@@ -6082,7 +6082,7 @@ class basic_json
                         {
                             return (v < 10)
                             ? ('0' + static_cast<char>(v))
-                            : ('a' + static_cast<char>(v - 10));
+                            : ('a' + static_cast<char>((v - 10) & 0xff));
                         };
 
                         // print character c as \uxxxx
diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c
index 0aa8321e..1c80915b 100644
--- a/src/json.hpp.re2c
+++ b/src/json.hpp.re2c
@@ -757,7 +757,7 @@ class basic_json
         /// assignment
         type_data_t& operator=(value_t rhs)
         {
-            bits.type = static_cast<uint16_t>(rhs);
+            bits.type = static_cast<uint16_t>(rhs) & 15; // avoid overflow
             return *this;
         }
 
@@ -765,7 +765,7 @@ class basic_json
         type_data_t(value_t t) noexcept
         {
             *reinterpret_cast<uint16_t*>(this) = 0;
-            bits.type = static_cast<uint16_t>(t);
+            bits.type = static_cast<uint16_t>(t) & 15; // avoid overflow
         }
 
         /// default constructor
@@ -6082,7 +6082,7 @@ class basic_json
                         {
                             return (v < 10)
                             ? ('0' + static_cast<char>(v))
-                            : ('a' + static_cast<char>(v - 10));
+                            : ('a' + static_cast<char>((v - 10) & 0xff));
                         };
 
                         // print character c as \uxxxx