C++提取short类型各字节无法同时获取全部字节问题咨询
问题原因分析
- 指针运算逻辑错误:C/C++的指针偏移量和指针类型直接绑定,
short*类型指针执行++操作时,会自动偏移sizeof(short)也就是2字节,而你定义的short变量本身仅占2字节内存,p1++后指向的已经是变量i所属内存范围之外的非法地址,读取到的是栈上的随机垃圾值,这是你输出c1得到ffffffcc的核心原因。 - 内存访问逻辑错误:直接对
short*解引用后转char,本质是先取出完整的short值再截断到低8位,仅能拿到低字节,不符合逐字节访问内存的需求。 - 额外说明:输出中
c1显示为ffffffcc是因为Windows下默认char是有符号类型,当读取到的字节最高位为1时,转unsigned int会触发符号扩展,高位自动补1。
正确实现思路
要逐字节访问多字节变量,需要先把地址强转为char*类型,char*的步长固定为1字节,偏移后刚好可以访问相邻的每个字节。
修正后代码
#include <iostream> using namespace std; int main() { short i = 0x1123; // 强转为char*,步长为1字节 char* p = reinterpret_cast<char*>(&i); char* p1 = p + 1; char c = *p; char c1 = *p1; cout << "Short: " << hex << i << '\n' << "p: " << static_cast<void*>(p) << '\n' << "p1: " << static_cast<void*>(p1) << '\n' // 先转unsigned char再转int,避免符号扩展 << "c: " << hex << static_cast<unsigned int>(static_cast<unsigned char>(c)) << '\n' << "c1: " << hex << static_cast<unsigned int>(static_cast<unsigned char>(c1)) << '\n'; return 0; }
预期输出(小端序环境)
Short: 1123 p: 0041FB58 p1: 0041FB59 c: 23 c1: 11
内容的提问来源于stack exchange,提问作者TheOnlyWAR10CK93
相关产品推荐
相关产品推荐

