数据在内存中存储
658 字
3 分钟
数据在内存中存储
整数在内存中的存储
整数的二进制表示方法
- 原码:直接将数值按照正负数形式翻译成二进制
- 反码:原码符号位不变,其他位按位取反
- 补码:反码 + 1
表示规则
- 正整数:原码、反码、补码都相同
- 负整数:三种表示方法各不相同
- 符号位:最高位,0表示正,1表示负
为什么使用补码存储?
- 将符号位和数值域统一处理
- 加法和减法可以统一处理(CPU只有加法器)
- 补码与原码相互转换过程相同,不需要额外硬件电路
大小端字节序
概念
- 大端字节序:数据低位保存在内存高地址,数据高位保存在内存低地址
- 小端字节序:数据低位保存在内存低地址,数据高位保存早内存高地址
字节序判断程序
// 方法1:指针方式int check_sys() { int i = 1; return (*(char *)&i);}
// 方法2:联合体方式int check_sys() { union { int i; char c; } un; un.i = 1; return un.c;}浮点数在内存中存储
浮点数表示公式
S:符号位(0正1负) M:有效数字(1 ≤ M < 2) E:指数位
存储格式
-
float类型(32位)
S(1bit) + E(8bit) + M(23bit) -
double类型(64位)
S(1bit) + E(11bit) + M(52bit)
存储规则
M的存储
- 1 ≤ M < 2,总是1.xxxxxx形式
- 存储时省略前导1,只保存小数部分
- 读取时自动补回前导1
E的存储
- E为无符号整数
- 实际存储值 = 真实值 + 中间数
- 8位E:中间数 = 127
- 11位E:中间数 = 1023
读取规则
E不全为0或不全为1
- 真实E = 存储E - 中间数
- M前补回1
E全为0
- 真实E = 1 - 中间数
- M不再补1,直接为0.xxxxxx
- 表示±0或接近0的小数
E全为1
- M全为0:表示±无穷大
- 否则:表示非数值
浮点数储存解析
int n = 9;float *pFloat = (float *)&n;printf("n的值为:%d\n", n); // 输出:9printf("*pFloat的值为:%f\n", *pFloat); // 输出:0.000000
*pFloat = 9.0;printf("num的值为:%d\n", n); // 输出:1091567616printf("*pFloat的值为:%f\n", *pFloat); // 输出:9.000000第一部分解析
- 整数9的二进制:
00000000 00000000 00000000 00001001 - 按浮点数解析:
- S=0(正数)
- E=00000000(全0)
- M=00000000000000000001001
- E全0,根据规则:V = (-1)^0 × 0.00000000000000000001001 × 2^(-126)
- 这是一个极小的正数,%f输出为0.000000
第二部分解析
- 浮点数9.0 = 1.001 × 2^3
- IEEE 754表示:
- S=0
- E=3+127=130=10000010
- M=00100000000000000000000
- 完整二进制:
0 10000010 00100000000000000000000 - 这个二进制作为整数解析:1091567616
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
内存管理
C/C++栈(Stack) 存储非静态局部变量、函数参数、返回值 向下增长(从高地址向低地址) 自动分配和释放 堆(Heap) 动态内存分配区域 向上增长(从低地址向高地址) 手动管理(malloc/free, new/delete) 数据段/静态…
2
c语言内存函数
C/C++从source位置开始向后复制num个字节到destination指向的内存位置 不会在遇到'\0'时停下来 如果source和destination有重叠,复制结果是未定义的 适用于非重叠内存区域的拷贝
3
动态内存分配
C/C++现有内存开辟方式局限性 缺点:
4
多态
C/C++多态(polymorphism):即"多种形态",指同一接口表现出不同行为的能力。
5
结构体
C/C++结构体:一些值的集合,这些值称为成员变量 每个成员可以是不同类型变量
随机文章随机推荐

