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

这段基于指针的C语言代码输出是什么?请解释其原因

基于指针的C语言代码输出分析与解释

首先先把代码贴出来:

#include <stdio.h>
#include <stdlib.h>
int main() {
    int i;
    double a=5.2;
    char*ptr;
    ptr=(char*)&a;
    for(int i=0;i<=7;i++)
        printf("%d",*ptr++);
    return 0;
}

输出结果(分系统端序)

这段代码的输出取决于你的系统是小端序还是大端序,这是当前主流的两种内存字节排列方式:

  • 在小端序系统(绝大多数x86/x86_64架构的电脑,比如常见的Windows、Linux桌面设备)下,输出会是:-51-52-52-52-52-522064
  • 在大端序系统(部分嵌入式设备、PowerPC架构等)下,输出会是:6420-52-52-52-52-52-51

为什么会产生这样的输出?

我们一步一步拆解背后的原理:

1. double类型的内存存储规则

double a=5.2; 中,变量a是双精度浮点数,遵循IEEE 754标准,占用8个字节(64位)。5.2的二进制表示拆解如下:

  • 符号位(1位):0(表示正数)
  • 指数位(11位):10000000001(对应十进制1025,是标准偏移量1023加上实际指数2)
  • 尾数位(52位):0100110011001100110011001100110011001100110011001101(存储0.2的循环二进制小数部分,最后一位做了四舍五入)

把这些部分拼接成完整的64位二进制串后,对应8个字节的十进制值如下:

字节(大端顺序,从最高到最低有效字节)无符号十进制有符号十进制(char默认是有符号类型)
010000006464
000101002020
11001100204-52
11001100204-52
11001100204-52
11001100204-52
11001100204-52
11001101205-51

2. char*指针的逐字节访问特性

char* ptr=(char*)&a; 把double*类型的指针强制转换成char*,这意味着指针会逐字节访问内存,而不是按double的8字节单元来读取。

3. 端序对读取顺序的影响

  • 小端序:内存中低地址存储数据的最低有效字节,所以ptr一开始指向的是最后一个字节(11001101,对应有符号十进制-51),每次循环ptr自增,指向下一个更高地址的字节,所以输出顺序是从-51开始,依次到64。
  • 大端序:内存中低地址存储数据的最高有效字节,ptr一开始指向第一个字节(01000000,对应64),每次自增指向更低有效字节,输出顺序从64开始到-51。

4. printf的%d输出逻辑

printf("%d", *ptr++) 中,*ptr是char类型,当传给printf的%d格式符时,会被自动提升为int类型。如果char是有符号的(绝大多数编译器默认),当字节的最高位是1时,会进行符号扩展,把负数的补码形式扩展为int类型,所以输出负数;最高位是0时则直接扩展为正数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:28:20