C++中reinterpret_cast转换int到short指针的结果困惑
问题原因:小端字节序的存储规则
这是因为你使用的64位MSVC环境基于x86/x64架构,该架构采用**小端字节序(Little Endian)**存储多字节数据,导致你通过short*读取到的是int变量的低2字节,而非你预想的高2字节。
具体分析:
- 你定义的
int num = 7,二进制表示确实是00000000 00000000 00000000 00000111(4字节)。但小端字节序的存储规则是:最低有效字节(数值的低位部分)放在内存的最低地址,最高有效字节放在最高地址。 - 因此
num在内存中的实际布局(从地址0000005E3DBEF7B0开始)为:地址 0000005E3DBEF7B0 → 00000111(第1字节,对应数值的低位) 地址 0000005E3DBEF7B1 → 00000000(第2字节) 地址 0000005E3DBEF7B2 → 00000000(第3字节) 地址 0000005E3DBEF7B3 → 00000000(第4字节,对应数值的高位) - 当你通过
reinterpret_cast<short*>(pold)得到pnew后,*pnew会从pold指向的起始地址读取2个字节,也就是上述的前两个字节。对于short类型(2字节),小端规则同样生效,这两个字节组合后的值为00000000 00000111,即十进制的7。 sizeof(*pnew)=2和sizeof(*pold)=4是完全正常的:short类型本身占用2字节,int类型在MSVC的64位环境下占用4字节,这是类型的固有属性,和指针转换操作无关。- 而
*pold仍然为7,是因为你只是通过指针转换读取了原变量的部分字节,并未修改num的内存内容,所以原int变量的值保持不变。
内容的提问来源于stack exchange,提问作者user22691690
相关产品推荐
相关产品推荐

