diff --git a/py/builtin.c b/py/builtin.c
index b02608b40736323e32b16189fbc2f1a6b46483dc..5911fa6342bbd86ce2775acfbe89be8be318ae77 100644
--- a/py/builtin.c
+++ b/py/builtin.c
@@ -208,7 +208,7 @@ STATIC mp_obj_t mp_builtin_hash(mp_obj_t o_in) {
 MP_DEFINE_CONST_FUN_OBJ_1(mp_builtin_hash_obj, mp_builtin_hash);
 
 STATIC mp_obj_t mp_builtin_hex(mp_obj_t o_in) {
-    return mp_binary_op(MP_BINARY_OP_MODULO, MP_OBJ_NEW_QSTR(MP_QSTR__percent_x), o_in);
+    return mp_binary_op(MP_BINARY_OP_MODULO, MP_OBJ_NEW_QSTR(MP_QSTR__percent__hash_x), o_in);
 }
 
 MP_DEFINE_CONST_FUN_OBJ_1(mp_builtin_hex_obj, mp_builtin_hex);
diff --git a/py/makeqstrdata.py b/py/makeqstrdata.py
index f8605ae093adff5d7a274aeea1e5c1280fe42387..8620af56738aba8a39e0222e37670d332a0013b1 100644
--- a/py/makeqstrdata.py
+++ b/py/makeqstrdata.py
@@ -17,6 +17,7 @@ codepoint2name[ord('.')] = 'dot'
 codepoint2name[ord(':')] = 'colon'
 codepoint2name[ord('/')] = 'slash'
 codepoint2name[ord('%')] = 'percent'
+codepoint2name[ord('#')] = 'hash'
 
 # this must match the equivalent function in qstr.c
 def compute_hash(qstr):
diff --git a/py/qstrdefs.h b/py/qstrdefs.h
index e9f2d8d9a419990ce160707b35a383b39d6649ae..d18882f69ea2695aebbd4512ae9302624e32c5db 100644
--- a/py/qstrdefs.h
+++ b/py/qstrdefs.h
@@ -107,7 +107,7 @@ Q(getattr)
 Q(globals)
 Q(hash)
 Q(hex)
-Q(%x)
+Q(%#x)
 Q(id)
 Q(io)
 Q(int)