Well, but what if you're working with a 16-bit microcontroller? Apparently, there were quite some heated discussions about that which is why, while size_t was required to be at least 16 bits, ptrdiff_t was required to be at least
17 bits, in C99... and then it was reverted back to 16 bits in C23. See e.g. [0]
This trade-off is actually making me sad. One can either have all the sizes and offsets fit into (unsigned/signed) integers, or one can have objects spanning more than half of the memory space. I think for my language I'd pick "all sizes/offsets are signed, and so yeah, you can't span all of the memory with a single char array".
[0] https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2808.htm