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

memcpy函数是否会引发符号扩展?新手代码输出异常求助

问题原因分析

第一个代码片段的输出解释

你的第一个代码里,char *p指向的内存被memcpy写入了1字节的0xef。在绝大多数编译器中,char是有符号类型,0xef的二进制是11101111,最高位为1,代表这是一个负数(对应十进制的-17)。

当你用printf("%x", *p)输出时,*p作为char类型会触发整数提升:有符号数提升时会进行符号扩展,也就是把最高位的1填充到所有高位,最终char类型的0xef会被转换成int类型的0xffffffef,这就是你看到的输出结果。

第二个代码片段的输出解释

第二个代码里,y是int类型,初始值为0,内存中四个字节都是0x00。memcpy(&y, &x, 1)只把x的第一个字节(0xef)复制到y的最低字节,剩下的三个字节依然是0x00,所以y的最终值是0x000000ef。

此时y本身就是int类型,不存在整数提升的过程,printf("%x", y)直接输出这个无符号十六进制值,所以结果是0x000000ef(通常会省略前导零,显示为ef)。

关键总结

  • 核心差异在于类型的符号性和整数提升规则:有符号char在提升为int时会触发符号扩展,而int类型本身不需要提升,直接输出内存中的值。
  • 如果想让第一个代码输出0xef,可以把char改为unsigned char,这样提升时会进行零扩展,高位补0,最终输出0xef。

内容的提问来源于stack exchange,提问作者Cpper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:52:06