前言
在计算机科学领域,理解数据在内存中的存储方式是非常重要的。本篇博客将详细介绍数据类型、整形和浮点型数据的存储方式,以及大端和小端字节序的概念,并通过具体示例深入剖析。
一 、数据类型介绍
数据类型是编程的基础,每种数据类型在内存中都有其独特的存储方式。主要包括以下几类:
1. 整形家族:
- `char`:字符数据类型,通常占用1个字节。(为什么char也属于整形家族呢?因为字符在存储的时候存的是ASCLL码值,ASCLL码值是整形,所以char归类到整形家族。)
- `short`:短整型,通常占用2个字节。
- `int`:整形,通常占用4个字节。
- `long`:长整型,通常占用4或8个字节。
- `long long`:更长的整型,通常占用8个字节。
2. 浮点数家族:
- `float`:单精度浮点数,通常占用4个字节。
- `double`:双精度浮点数,通常占用8个字节。
3. 构造类型:
- 数组类型
- 结构体类型 (`struct`)
- 枚举类型 (`enum`)
- 联合类型 (`union`)
4.指针类型:
指向特定类型数据的指针,例如`int *pi`,`char *pc`。
5. 空类型:
`void`表示无类型,通常用于函数的返回类型、函数的参数或指针类型。
6. 类型的意义
1)使用这个类型开辟内存空间的大小(大小决定了使用范围)。
2)如何看待内存空间的视角。
二 、整形在内存中的存储
整形数据在内存中的存储方式可以通过原码、反码和补码来理解。这里要注意正数的原码、反码、补码都相同,负数的补码需要计算。
- 原码:直接将二进制按照正负数的形式表示。
- 反码:将原码的符号位不变,其他位依次按位取反。
- 补码:反码加1得到补码。正数的原、反、补码都相同。
比如:-10的二进制表示原码:10000000000000000000000000001010
反码:111111111111111111111111111111110101
补码:111111111111111111111111111111110110
在计算机系统中,数值一律用补码来表示和存储。这是因为补码可以将符号位和数值域统一处理,同时加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
#include <stdio.h>
int main() {
int a = 5;
int b = -5;
printf("5 的补码是:%d\n", a);
printf("-5 的补码是:%d\n", b);
return 0;
}
上述代码输出如下:
5 的补码是:5
-5 的补码是:-5
这段代码中,我们直接输出了整型变量`a`和`b`的补码表示。虽然输出的是整数值,但在内存中实际存储的是它们的补码。
三、大端和小端字节序
数据在内存中的存储顺序有两种方式:大端(Big-Endian)和小端(Little-Endian)。
- **大端模式**:数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中。
- **小端模式**:数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
小端模式是常见的存储方式,许多计算机系统采用这种方式。判断机器的字节序可以通过简单的代码实现:
#include <stdio.h>
int check_sys() {
int i = 1;
return (*(char *)&i);
}
int main() {
int ret = check_sys();
if(ret == 1) {
printf("小端\n");
} else {
printf("大端\n");
}
return 0;
}
上述代码通过检查整数`1`在内存中的存储方式来判断系统的字节序。如果最低字节存储的是1,则系统是小端模式;否则是大端模式。
四、浮点型在内存中的存储
浮点数的存储更加复杂,根据IEEE 754标准,任意一个二进制浮点数可以表示成`(-1)^S * M * 2^E`的形式。
- 符号位 (S):决定浮点数的正负,当`S=0`时,浮点数为正,当`S=1`时,浮点数为负。
- 有效数字 (M):大于等于1,小于2。
- 指数 (E):决定浮点数的范围。
对于32位的浮点数,最高的1位是符号位,接着的8位是指数E,剩下的23位为有效数字M。
示例:
假设我们有一个浮点数5.0,将其转换为二进制后是101.0,可以表示成`1.01 × 2^2`。
在IEEE 754标准下,浮点数5.0的存储方式如下:
- 符号位S:0(正数)
- 指数E:2 + 127 = 129(偏移量127)
- 有效数字M:01(去掉默认的第一位1)
其二进制表示为:`0 10000001 01000000000000000000000`。
如果我们将其存储在内存中(假设是小端序),存储顺序如下:
00000000 00000000 10100000 01000000
但同时也要注意因为浮点型的特殊性,有些数字并不能完全精确的记录,比如3.14小数点后两位转化为二进制不能精确存储。
五、总结
理解数据在内存中的存储方式对于编写高效的程序至关重要。无论是整形数据的补码表示,还是浮点数的IEEE 754标准,都需要我们深入理解其原理,以便在实际编程中得心应手。希望这篇博客对你有所帮助,祝大家在编程的道路上越走越远!