Footnote 2 of the Coyotos Microkernel Specification suggests you are assuming: ((uint64_t) 0 << 64) == 0 That is true, as you say, "on most architectures", however the definition of C is that the result of the shift is simply undefined.