diff --git a/py/mpz.h b/py/mpz.h
index d2b6fad5c6d39a934ba6822a7c640b567dcbe6f1..d52e58b0c9c4276231acb1232ec61d955086bcd5 100644
--- a/py/mpz.h
+++ b/py/mpz.h
@@ -69,7 +69,7 @@ typedef int32_t mpz_dbl_dig_signed_t;
 typedef struct _mpz_t {
     mp_uint_t neg : 1;
     mp_uint_t fixed_dig : 1;
-    mp_uint_t alloc : 30;
+    mp_uint_t alloc : BITS_PER_WORD - 2;
     mp_uint_t len;
     mpz_dig_t *dig;
 } mpz_t;
diff --git a/py/parse.c b/py/parse.c
index dc2780c7ee33edfce9d17ac68fa49248ee86e50d..881a11e734629b96e3e76b749f4b1550e1d2d726 100644
--- a/py/parse.c
+++ b/py/parse.c
@@ -108,9 +108,9 @@ STATIC const rule_t *rules[] = {
 };
 
 typedef struct _rule_stack_t {
-    mp_uint_t src_line : 24;
-    mp_uint_t rule_id : 8;
-    mp_uint_t arg_i : 32; // what should the bit-size be?
+    mp_uint_t src_line : BITS_PER_WORD - 8; // maximum bits storing source line number
+    mp_uint_t rule_id : 8; // this must be large enough to fit largest rule number
+    mp_uint_t arg_i; // this dictates the maximum nodes in a "list" of things
 } rule_stack_t;
 
 typedef struct _parser_t {