# Pre-RFC: Arbitrary bit-width integers

**URL:** <https://internals.rust-lang.org/t/pre-rfc-arbitrary-bit-width-integers/15603>\
**Category:** language design\
**Created:** [November 14, 2021, 4:27pm UTC](https://internals.rust-lang.org/t/pre-rfc-arbitrary-bit-width-integers/15603 "2021-11-14T16:27:52Z")\
**Posts on this page:** 1\
**Showing post:** 31

<div class="post-metadata">

**Author:** ![felix.s](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/felix.s/32/8073_2.png) [@felix.s](https://internals.rust-lang.org/u/felix.s)\
**Post date:** [November 17, 2021, 2:26pm UTC](https://internals.rust-lang.org/t/pre-rfc-arbitrary-bit-width-integers/15603/31 "2021-11-17T14:26:58Z")

</div>

If `uN` covers the range [0, 2N) and `iN` covers the range [−2N − 1, 2N − 1), then `u0` should cover [0, 1), while `i0` should cover [−½, ½). The only integer in either range is zero. This removes the ambiguity. (Shamelessly stolen from [scottmcm’s post](https://internals.rust-lang.org/t/pre-rfc-generic-integers-uint-n-and-int-n/7641/36).)

Alternatively, if we require that

- `<T as Default>::default().into<U>() == <U as Default>::default()`,
- `iN : Default`, and
- `iN : Into<iM>` for N ≤ M,

then we also must have `<i0 as Default>::default()` be zero.

* * *

Back to the issue at hand: I would favour a solution where irregular-bit-width integers behave like ordinary types with respect to ABI, while bitpacking is solved by [an orthogonal feature](https://github.com/fstirlitz/rust-rfcs/blob/2f5bbb626fc2edb7585fdc826b62fdd023be148c/text/0000-compact-fields.md).

---

_[View the full topic](https://internals.rust-lang.org/t/pre-rfc-arbitrary-bit-width-integers/15603)._
