【发布时间】:2015-04-14 08:59:43
【问题描述】:
我想知道为什么——在我的示例代码中——当将对m_arr 的第一个元素的引用转换为更大大小的指针时,程序会以小端字节顺序将内存读取到m_val?用这种思路*(std::uint8_t*)m_arr应该指向0x38,但它没有。
我的 CPU 使用 little-endian 字节顺序。
#include <iostream>
#include <iomanip>
int main() {
std::uint8_t m_arr[2] = { 0x5a, 0x38 };
// explain why m_val is 0x385a and not 0x5a38
std::uint16_t m_val = *(std::uint16_t*)m_arr;
std::cout << std::hex << m_val << std::endl;
return 0;
}
【问题讨论】:
-
您的代码有未定义的行为。
-
也就是说,这看起来非常适合 WAI。小端(最不重要的一端)是第一个数组元素。值为
a[0] + 0x100 * a[1]。这就是“小端”的意思。 -
这是小端系统的预期行为,不是吗?最低有效字节(0x5a)在低地址中
-
这段代码违反了结构别名规则(
uint16_t类型的左值用于访问不同的东西) -
*(std::uint8_t*)m_arr不应指向 0x38。您正在获取std::uint8_t的数组,并执行显式数组到指针的转换。这会给你一个指向第一个元素的指针。字节序在这里无关紧要,因为指针类型与元素的类型相同。
标签: c++ endianness