1. 整数存储:原码、反码与补码的深入解析
在C语言底层开发中,理解数据在内存中的存储方式是基本功。让我们先从一个看似简单的问题开始:为什么-1在内存中的表示是0xFFFFFFFF?这就要从整数的三种二进制表示方法说起。
1.1 原码:最直观的表示法
原码是初学者最容易理解的表示方式。以8位整数为例:
- +5的原码:00000101(最高位0表示正数)
- -5的原码:10000101(最高位1表示负数)
原码的优点是符合人类直觉,但存在两个致命缺陷:
- 0有两种表示(+0和-0),造成浪费
- 加减运算复杂,需要区分符号位
1.2 反码:过渡性的改进方案
反码是对原码的改进:
- 正数反码与原码相同
- 负数反码=原码符号位不变,其余位取反
例如:
- +5的反码:00000101
- -5的反码:11111010
反码解决了加减法统一处理的问题,但依然存在±0的问题。这就引出了现代计算机普遍采用的补码方案。
1.3 补码:工程实践的完美选择
补码的规则:
- 正数补码=原码
- 负数补码=反码+1
以-5为例:
- 原码:10000101
- 反码:11111010
- 补码:11111011(反码+1)
补码的三大优势:
- 统一了0的表示(只有00000000)
- 加减法可以统一用加法器实现
- 表示范围比原码多一个(-128到127)
关键理解:补码的本质是用模运算实现负数表示。对于8位数,-5实际上是256-5=251,即0xFB。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 大小端字节序:内存排列的艺术
2.1 大端与小端的概念对比
让我们通过一个具体例子理解:
c复制int num = 0x12345678;
在内存中的存储方式:
| 模式 | 地址增长方向 → |
|---|---|
| 大端 | 12 34 56 78 |
| 小端 | 78 56 34 12 |
大端模式更符合人类阅读习惯(高位在前),而小端模式在类型转换时更有优势。
2.2 字节序的实战检测方法
这里给出一个更健壮的检测函数:
c复制#include <stdio.h>
#include <stdint.h>
voi
