2.5.1C语言中的数据表示
一、整数类型表示
在C语言中,整数类型分为 有符号整数(如short
, int
, long
) 和 无符号整数(如unsigned short
, unsigned int
)。它们的存储方式和数值范围由二进制位宽及编码规则决定。
1. 整数的存储机制
- 补码表示:计算机中存储有符号整数时,统一采用 补码(Two’s Complement),原因是补码可以消除原码和反码中“+0”与“-0”的冗余,并简化加减法运算。
- 正数补码:与原码相同,直接存储二进制。
- 负数补码:符号位为1,绝对值部分按位取反后加1。
示例:int a = -5
的补码表示 (32位):
原码:1000 0000 0000 0000 0000 0000 0000 0101
反码:1111 1111 1111 1111 1111 1111 1111 1010
补码:1111 1111 1111 1111 1111 1111 1111 1011
最高位为符号位,其他位为数值位。
2. 无符号整数与有符号整数对比
3. 常见整数类型范围
类型 | 位宽(32位系统) | 数值范围 |
---|---|---|
short | 16位 | -32768 ~ 32767 |
unsigned short | 16位 | 0 ~ 65535 |
int | 32位 | -2³¹ ~ 2³¹-1 |
unsigned int | 32位 | 0 ~ 4,294,967,295 |
long long | 64位 | -2⁶³ ~ 2⁶³-1 |
二、浮点数类型表示
C语言的浮点数遵循 IEEE 754标准,用科学计数法表示实数,包含 单精度(float, 32位) 和 双精度(double, 64位)。
1. IEEE 754结构分解
- 符号位(S):0表示正,1表示负。
- 阶码(E):采用 移码(Biased Exponent),偏置值=127(单精度)/1023(双精度)。
- 尾数(M):隐含最高位1的规格化小数部分,存储时省略前导的1。
公式: ( − 1 ) S × ( 1. M ) × 2 E − 偏置值 (-1)^S \times (1.M) \times 2^{E - \text{偏置值}} (−1)S×(1.M)×2E−偏置值
2. 浮点数的存储示例
以单精度浮点数float f = -8.25
为例:
- 十进制转二进制: − 1.00001 × 2 3 -1.00001 \times 2^3 −1.00001×23
- 编码过程:
- 符号位:
1
(负数) - 阶码:偏置值127 + 3 = 130 →
10000010₂
- 尾数:00001000000000000000000(23位)
- 符号位:
十六进制结果:C1040000H
(按二进制分段为符号+阶码+尾数)。
三、类型转换与精度问题
在混合运算中,C语言遵循 隐式类型提升规则,低精度类型向高精度类型转换,避免数据丢失。
1. 整型与浮点型转换
2. 精度损失示例
若float
转int
,直接丢弃小数部分:
float f = 3.1416;
int n = f; // n = 3
四、数据校验码:奇偶校验
为保证数据完整性,计算机采用校验码检测错误。简例:
- 奇校验:二进制数据中1的个数为奇数。
- 偶校验:二进制数据中1的个数为偶数。
应用场景:存储器校验、网络通信。
五、总结
- 整数:补码统一符号处理,无符号整数扩大数值范围。
- 浮点数:科学记数法编码,分离符号、阶码、尾数。
- 类型转换:遵循隐式规则,注意精度损失风险。
通过理解底层存储机制,开发者能更精准地选择数据类型,避免溢出和计算误差。
2.5.2现代微型计算机系统中的数据表示
一、基本数据类型与存储规范(基于IA-32架构)
所有数据以二进制形式存储,按格式分为:
二、整数表示详解
1. 无符号整数
-
特征:全二进制位用于数值,无符号位
-
示例:
0xA3 (1 Byte) -> 161(十进制)
-
数值范围:
类型 | 范围 |
---|---|
BYTE(8 bit) | 0 ~ 255 |
WORD(16 bit) | 0 ~ 65,535 |
DWORD(32 bit) | 0 ~ 4,294,967,295 |
2. 带符号整数(补码表示)
-
核心规则:
- 正数:直接存储原码
- 负数:原码取反+1,符号位扩展
-
特殊案例:
-5的32位补码表示: 原码:1000 0000 ... 0101 → 反码:1111 1111 ... 1010 → 补码:1111 1111 ... 1011
-
数值范围:
类型 | 范围 |
---|---|
DWORD(32 bit) | -2³¹ ~ 2³¹-1(-2147483648~2147483647) |
三、浮点数表示(IEEE 754标准)
- 编码公式:
Value=(−1)S×1.M×2E−127Value=(−1)S×1.M×2E−127 - 存储示例:
浮点数-8.25
的编码过程:-
1.二进制转换:-1000.01 → 规范化为
-1.00001 × 2³
-
2.编码结果:
Sign=1, E=130(10000010b), M=00001 (填充23位) → 十六进制:C1040000H
-
四、数据存储方式对比(大端 vs 小端)
编码方式 | 特征 | 典型应用 |
---|---|---|
大端(BE) | 高位字节在低地址 (0x12 34 → 12 34) | 网络传输、SPARC |
小端(LE) | 低位字节在低地址 (0x12 34 → 34 12) | x86、ARM(默认) |
五、高级数据类型与对齐
-
1.数据对齐规则:
- 内存地址需为数据类型大小的整数倍(如DWORD需4字节对齐)
#pragma pack(2) // 强制2字节对齐 struct Data { char a; // 1 Byte int b; // 4 Bytes(对齐到2 Byte边界) }; // 总大小=6 Bytes
-
2.扩展寄存器支持:
- SSE3指令集中的
__m128
类型:128位存储,直接支持并行计算
- SSE3指令集中的
总结
现代微型计算机通过标准化格式(如补码、IEEE 754)实现了数据高效存储与跨平台兼容性,理解这些表示方法对软硬件协同优化至关重要。设计程序时需特别注意内存对齐与存储格式,以发挥物理硬件的最大性能。