1. 数据在内存中的存储基础
作为一名C/C++开发者,理解数据在内存中的存储方式是基本功。很多看似奇怪的编程现象,比如类型转换时的数值变化、位运算的意外结果,其实都源于对内存存储机制的不了解。今天我们就来彻底搞懂这个基础但至关重要的知识点。
计算机内存本质上是一连串的"小格子",每个格子可以存储1个字节(8位二进制数)。当我们声明一个变量时,比如int a = 10;,这个整数10会被转换成二进制形式,然后存储在这些内存格子中。但具体如何转换、如何存储,就是我们要探讨的核心问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 整数的二进制表示方法
2.1 原码、反码和补码
整数的二进制表示有三种形式:原码、反码和补码。这三种表示法对于正整数来说是完全相同的,差异主要体现在负整数的表示上。
原码是最直观的表示方法:
- 最高位作为符号位(0表示正,1表示负)
- 其余位表示数值的绝对值
例如:
+5的原码:00000101
-5的原码:10000101
反码的规则:
- 正数的反码与原码相同
- 负数的反码:符号位不变,其他位取反
-5的反码:11111010
补码的规则:
- 正数的补码与原码相同
- 负数的补码:反码+1
-5的补码:11111011
实际经验:在调试器中查看内存时,看到的都是补码形式。理解这一点对调试数值相关bug非常重要。
2.2 为什么使用补码?
现代计算机普遍采用补码表示整数,主要基于以下几个关键原因:
-
统一加减法运算:补码表示下,加法运算可以直接用于减法。CPU只需要加法器就能完成加减运算,简化了硬件设计。
-
消除+0和-0的歧义:原码表示中有+0(00000000)和-0(10000000),而补码中只有一个0(00000000)。
-
表示范围对称:8位补码可以表示-128~127,比原码的-127~127多表示一个数。
计算示例:
code复制5 - 3 = 5 + (-3)
5的补码:00000101
-3的补码:11111101
相加结果:00000010 (即2)
3. 大小端字节序
3.1 什么是大小端?
当我们存储超过1个字节的数据时(如int通常是4字节),就面临字节排列顺序的问题。这就是所谓的大小端(Endi
