C语言数据在内存中的存储:原码、补码、浮点数详解

周叙
周叙
发布时间:2026-10-13| 7人浏览过
原创

C语言中所有数据在内存中均以二进制形式存在,整型数据主要存储补码,而浮点数遵循IEEE 754标准。本文详解原码、反码、补码之间的转换机制,以及涉及不同数据类型(如signed/unsigned char)时的截断、整型提升和格式化打印(如%d与%u)的完整运算过程。

整型数据在内存中的表示

在计算机内部,int、char 等整型数据的存储与运算均依赖于其补码形式。理解数据在内存中的表现,必须先掌握三种表示法:

  • 原码:直接将数值按正负号形式翻译成二进制,最高位为符号位。
  • 反码:在原码基础上,符号位保持不变,其余各位按位取反。
  • 补码:由反码加1得到。对于整数而言,内存中实际存放的就是补码。

此外,数据存入和取出还需要遵循一定的顺序,即字节序(Endianness)。现代大多数系统(包括Windows下的VS)默认采用小端存储(Little-endian),即将数据的高位字节保存在内存的高地址中,低位字节保存在低地址中。虽然这不影响数值的正确读取,但在涉及联合体或指针类型转换时需要特别注意。

第1步:整型截断与整型提升

当数据在不同大小的整型间传递或运算时,会触发截断或提升,且全程使用补码进行:

  1. 截断:将高位类型赋值给低位类型时,保留低位字节,丢弃高位字节。
  2. 整型提升:当 `char` 或 `short` 参与运算或打印时,会自动提升至 `int` 大小。若是有符号类型,需根据符号位填充(补1或补0);若是无符号类型,则高位一律补0。
#include <stdio.h>
int main()
{
    // 测试 signed vs unsigned char 的提升差异
    char a = -1;
    signed char b = -1;
    unsigned char c = -1;
    printf("a=%d, b=%d, c=%d\n", a, b, c);
    return 0;
}

分析上述代码的执行结果:

  • a 和 b 均为有符号类型。初始值 `-1` 的32位补码全为1。赋给8位 `char` 后截断为 `11111111`。打印 `%d` 时发生有符号整型提升,高位全部补1,恢复为32位的补码,转回原码输出 -1。
  • c 为无符号类型,截断后同样为 `11111111`。但打印时按无符号提升处理,高位补0。此时32位补码对应的十进制数为 255。

第2步:溢出与循环现象

char 类型的范围通常是 -128 到 127。超出此范围的赋值会发生“卷绕”。例如赋值 128,实际在内存中存的是其补码截断后的值,表现为 -128。以下示例展示了典型的字符串长度计算陷阱:

#include <stdio.h>
#include <string.h>
int main()
{
    char a[1000];
    int i;
    for(i=0; i<1000; i++)
    {
        a[i] = -1-i;
    }
    printf("%d", strlen(a));
    return 0;
}

strlen 函数遇到第一个 ASCII 码为 0 (即 \0)的字符停止计数。a[i] 从 -1 开始递减,依次经过 -128 到 127 的循环。直到 i=255 时,a[255] 的值回到 0。因此该数组长度为 255。

浮点数在内存中的储存

浮点数(如 float, double)的存储结构比整型复杂。根据IEEE 754标准,一个浮点数 V 可以表示为:

V = (-1)^S * M * 2^E

  • S(Sign):符号位。0为正,1为负。
  • M(Mantissa):有效数字,通常满足 1 ≤ M < 2。在内存中常省略开头的1。
  • E(Exponent):指数位。存储时会加上偏移量(如float加127),以支持负指数。

例如,将 9.0 存入 float 的过程: 1. 9.0 转为二进制 1001.0。 2. 科学计数法表示为 1.001 * 2^3(这里 S=0, M=1.001, E=3)。

在 float 的32位存储结构中:
- S占1位:0
- E占8位:真实值3 + 127 = 130,即 10000010
- M占23位:省略小数点后的1,存 00100000000000000000000

最终内存组合为:`0 10000010 00100000000000000000000`。

以上就是C语言编程数据在内存中的存储详解的详细内容,更多关于C语言数据在内存中的存储的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。