整数和浮点数在内存中的存储方式是不一样的,今天,我们来具体学习一下
文章目录
- 整数在内存中的存储
- 浮点数在内存中的存储
整数在内存中的存储
我们在之前就已经了解过了整数有原码,反码,补码的形式,这三种方式都是二进制
三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表⽰“负”,⽽数值位最
⾼位的⼀位是被当做符号位,剩余的都是数值位。
原码:整数直接变成二进制的形式
反码: 原码的符号位不变,其他位按位取反得到的就是反码
补码:反码加一得到的就是补码
对于整数来说,都是以补码的形式存储到计算机中的。
这是因为使⽤补码,可以将符号位和数值域统⼀处理;
同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是
相同的,不需要额外的硬件电路。
大端和小端存储方式
首先,什么是大小端存储呢?
⼤端(存储)模式:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存
在内存的低地址处。
⼩端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存
在内存的⾼地址处。
这就是一个大小端的简单判断,这里低地址存放的是十六进制的44,低地址存放的的低位字节,所以这时一个小端存储的机器。
下面,我来分享一个非常巧妙的判断大小端的代码,
利用了联合体
#include <stdio.h>
int main() {
union {
int a;
char ch;
} u;
u.a = 1;
if (u.ch == 1)
printf("小端");
else
printf("大端");
return 0;
}
为什么会有大小端之分呢?
超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题
因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着⼀个字节,⼀个字节为8
bit 位,但是在C语⾔中除了8 bit 的 char 之外,还有16 bit 的 short 型,32 bit 的 long 型(要看
具体的编译器),另外,对于位数⼤于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度⼤
于⼀个字节,那么必然存在着⼀个如何将多个字节安排的问题。因此就导致了⼤端存储模式和⼩端存
储模式。
浮点数在内存中的存储
根据国际标准IEEE(电⽓和电⼦⼯程协会) 754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:
V = (−1) ^ S* M * 2^E
(−1)^S 表⽰符号位,当S=0,V为正数;当S=1,V为负数
M表⽰有效数字,M是⼤于等于1,⼩于2的
E 表⽰指数位
⼗进制的5.0,写成⼆进制是 101.0 ,相当于 1.01×2^2 。
那么,按照上⾯V的格式,可以得出S=0,M=1.01,E=2。
float类型
double类型
前⾯说过, 1≤M<2 ,也就是说,M可以写成 1.xxxxxx 的形式,其中 xxxxxx 表⽰⼩数部分。
IEEE 754 规定,在计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,只保存后⾯的
xxxxxx部分。⽐如保存1.01的时候,只保存01,等到读取的时候,再把第⼀位的1加上去。这样做的⽬
的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保
存24位有效数字。