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
相关产品推荐
相关产品推荐

