数据在内存中存储

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;
}

浮点数在内存中存储#

浮点数表示公式#

V=(−1)S×M×2EV = (-1)^S × M × 2^E

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); // 输出:9
printf("*pFloat的值为:%f\n", *pFloat); // 输出:0.000000
*pFloat = 9.0;
printf("num的值为:%d\n", n); // 输出:1091567616
printf("*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

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Profile Image of the Author
HandlerOne
おかえり
公告
本站已整理 138 篇技术笔记,并按 8 条主线排成学习路线(141 站);站内搜索与桌宠对话均已上线。
分类
标签
最新动态
站点统计
文章
138
分类
12
标签
42
总字数
597,044
站点信息
构建平台
腾讯云 · Nginx
博客版本
v6.16.8
文章目录