
大家好今天这篇文章彻底、详细、零基础可懂地讲解 C 语言数据在内存中的存储方式包含原码反码补码、大小端、整型/字符型/浮点型存储是C语言核心基础建议收藏反复看。一、为什么要学数据在内存中的存储在C语言里所有变量最终都存在内存里只有搞懂存储规则你才能真正理解为什么负数运算不会出错为什么强制类型转换会出奇怪的值为什么浮点数不能用 比较指针到底在操作什么数据溢出是怎么发生的这是从“会写代码”到“懂代码”的关键一步。二、内存基础单位与寻址内存基本单位bit(位)最小单位只能存 0 或 1Byte(字节)1 Byte 8 bit内存基本寻址单元1KB 1024Byte以此类推常见类型字节大小32/64位通用char1 字节short2 字节int4 字节long4/8 字节float4 字节double8 字节内存是连续的、按字节编号的这个编号就是地址。三、整型在内存中的存储原码、反码、补码计算机只存储二进制整型一律以补码存放。三个码的规则正数原码 反码 补码负数原码最高位是符号位1表示负0表示正反码原码符号位不变其余按位取反补码反码 1举例以 char 类型 10 和 -10 为例char 是 1 字节 8 位10 的存储原码0000 1010反码0000 1010补码0000 1010→ 内存中就是00001010-10 的存储原码1000 1010反码1111 0101补码1111 0110→ 内存中存的是补码11110110为什么要用补码用补码可以把减法变成加法符号位可以直接参与运算避免了 0 和 -0 重复表示这是计算机设计最优解。四、深入4字节int在内存中的存放顺序大小端int 占 4 个字节这 4 个字节在内存里有两种排放顺序大端序、小端序。概念大端存储高字节存低地址小端存储低字节存低地址举例int a 0x12345678内存 4 个字节大端12 34 56 78小端78 56 34 12我们平时用的电脑 x86/x64 都是小端模式代码验证大小端非常经典运行结果几乎都是小端存储五、char 类型在内存中的存储char 是1字节整型分两种signed char范围 -128 ~ 127unsigned char范围 0 ~ 255字符存储的是 ASCII 码值。例如char 本质就是最小的整数所以它也遵循补码规则。六、浮点数float/double在内存中的存储浮点数不使用补码而是按照 IEEE 754 标准 存储。存储结构float32位符号位 S1位指数位 E8位尾数位 M23位double64位符号位 S1位指数位 E11位尾数位 M52位公式V (-1)^S * M * 2^E重点结论面试常考浮点数存储有精度损失浮点数不能直接用 比较越大的整数越无法被浮点数精确表示七、数据溢出非常重要当数据超出类型范围就会环绕溢出。例如 signed char127 1 -128-128 - 1 127这就是因为补码循环导致的是C语言非常经典的坑。八、总结一张图记住所有重点内存以字节为单位数据全是二进制整型存储补码现代计算机小端存储char 1字节整数存ASCII浮点数 IEEE754有精度误差超出范围会发生数据溢出文末本篇详细讲解了C语言数据在内存中的完整存储规则是指针、结构体、内存操作的基础。原创不易觉得有用欢迎点赞、收藏、关注后续继续更新C语言进阶干货