Minor point: sizeof(char) was defined to be 1 even in the original C89. "char" has always been a misspelling of "byte" in C.
It is, but not required to be an octect. Quoting from the standard (n1570, 3.6):
byte ==== addressable unit of data storage large enough to hold any member of the basic character set of the execution environment
Later in a comment (page 44 in pdf, note 49): A byte contains CHAR_BIT bits
It does, via bit-fields.
To be honest, I hope compilers don't do such things. I would vastly prefer to see it run Tower of Hanoi simulation in Emacs at this point.
But evading bound-checking of 8bit math done in 32bit registers is totally reasonable (by the standard of usual UB optimizations), thanks.