Because byte order is an arbitrary design decision. Once in a register, there is no byte order1.
Byte order arises when we address smaller units like bytes. It s an essentially arbitrary decision the CPU designer gets to make: big-endian or little-endian.
It s useful to simplify the situation and realize that it is mainly the connection to peripherals that is byte ordered. Yes, it can be discovered via byte addressing as you have proved, but in general scalar values are loaded and stored as units, into registers, and in this case byte order doesn t change anything. The most significant bits are on "the left", at least, the way we usually write numbers. And that s why the <<
and >>
operators always produce the exact same results on big-endian vs little-endian machines when used according to the language standards.
But in order to read and write data streams to peripheral devices, you are forced to choose a byte order. This is because peripherals are fundamentally byte stream devices. Does the lowest address have the most significant bits or the least? It s done both ways and the camps used to be rather evenly divided.
Because memory itself is byte addressed, it s certainly possible to derive different behavior without a peripheral, but this typically doesn t happen without a deliberate peek inside like you did.
Imagine a CPU that has no bytes, only 32-bit words, addressed as 0, 1, 2. The C compiler makes char, int, and long all 32-bit objects. (This is allowed by Cx9.) Wow, no byte order issues! It s both! But .. what happens when we hook up our first peripheral??
1.Well, x86 has registers that alias smaller registers, but that s another story.