Next: Other-immediates, Previous: Structures, Up: Object Format [Contents]
A fixnum has one of the following formats in 32 bits:
------------------------------------------------------- | 30 bit 2's complement even integer | 0 0 0 | -------------------------------------------------------
or
------------------------------------------------------- | 30 bit 2's complement odd integer | 1 0 0 | -------------------------------------------------------
Effectively, there is one tag for immediate integers, two zeros. This buys one more bit for fixnums, and now when these numbers index into simple-vectors or offset into memory, they point to word boundaries on 32-bit, byte-addressable machines. That is, no shifting need occur to use the number directly as an offset.
This format has another advantage on byte-addressable machines when fixnums are offsets into vector-like data-blocks, including structures. Even though we previously mentioned data-blocks are dual-word aligned, most indexing and slot accessing is word aligned, and so are fixnums with effectively two tag bits.
Two tags also allow better usage of special instructions on some machines that can deal with two low-tag bits but not three.
Since the two bits are zeros, we avoid having to mask them off before using the words for arithmetic, but division and multiplication require special shifting.