You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:45:01