如何更好地将偏移量为 i
的uint8_t
数组转换为uint64_t
类型?建议采用哪种方式,为什么?
uint8_t * bytes = ...
uint64_t const v = ((uint64_t *)(bytes + i))[0];
或
uint64_t const v = ((uint64_t)(bytes[i+7]) << 56)
| ((uint64_t)(bytes[i+6]) << 48)
| ((uint64_t)(bytes[i+5]) << 40)
| ((uint64_t)(bytes[i+4]) << 32)
| ((uint64_t)(bytes[i+3]) << 24)
| ((uint64_t)(bytes[i+2]) << 16)
| ((uint64_t)(bytes[i+1]) << 8)
| ((uint64_t)(bytes[i]));
((uint64_t*)(bytes + i))[0]
时,字节顺序取决于底层系统的大小端。而采用另一种方式,则可以明确选择所需的字节顺序。 - Some programmer dudebytes
和系统都是小端字节序,除此之外还有其他的区别吗? - err69uint64_t
指针的对齐要求非常严格,因此重新解释uint8_t
指针可能会引发异常(例如某些ARM架构)。 - Jackwhatever *
转换为intptr_t
(自C99后可选类型),然后再转换为uint64_t
。 - Neil