这篇博客主要是来帮助大家理解在内存里,整数与浮点数的存储形式。
一、我们得先知道整数与浮点数存储形式的不同有什么实际意义:
1、更好地理解计算机的工作原理。
2、可以解决一部分在编程中遇到的问题。
二、整数的存储。
1、我们先了解数据所占内存的表示,字节(Byte)是计算机信息技术用于计量存储容量的一种计量单位,比特(bit)就是是计算机表示数据最小的单位,而它们的进制关系为:1byte=8bit,在通常情况下int类型的数在内存中占4字节,也就是32个比特位。
2整数有着int,short,long,long long前缀型,整形数据以二进制的形式存储于内存中,一个2进制位就是一个bit位,那么一个int型的数据就会占32个2进制位,一般来说32位2进制位来观察数字太长了,以16进制来表示数字,例如1–0X00000001比较方便;
3大端存储与小端存储:为什么会存在大端与小端存储呢?-----这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着⼀个字节,⼀个字节为8bit位,但是在C语⾔中除了8bit的 char 之外,还有16bit的 short 型,32bit的 long 型(要看具体的编译器),另外,对于位数⼤于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度⼤于⼀个字节,那么必然存在着⼀个如何将多个字节安排的问题。因此就导致了⼤端存储模式和⼩端存储模式。 上面我们知道了整数在内存里的存储,但是内存有高地址,有低地址,整数的存储都是先存较小的二进制位,例如0x00000001,如果1存于低地址处我们称为小端存放,反之则为大端存放;
4下面是一个可以判断编译器是大小端存储的简单代码:
#include<stdio.h>
int test()
{
int a=1;
return *(char*)&a;
}
int main()
{
int ret=test();
if(ret==1)
printf("小");
else
printf("大");
return 0;
}
总之不同的编译器可能出现不同的存储方式。
三、浮点数的存储:
浮点数的存储方式与整数有很大的不同;
1、根据国际标准IEEE(电⽓和电⼦⼯程协会)754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:
(-1)S* M* 2E
例如:5.5写成2进制就是101.1,再将其化为标准式(-1)0* 1.011* 22;M永远>=1且<2,那么用这个式子表达的浮点数里-1,M的小数点前面的1,2为公共部分,计算机在存储浮点数时只会存储S(0/1)(一个2bit位),E(unsigned)(32位8个2bit位)(64位11个2bit位),M小数点后的数(32位23个bit位)(64位52个bit位)。但是我们知道E的值可能会出现负数,那么这时IEEE 754规定存入E的真实值时必须再加上一个中间值使这个值大于0,8位的E中间值为127,11位的E中间值为1023。例如存放5.5----0 10000001 01100000000000000000000
2、我们将存入的浮点数取出也是有一定规则的
1、当存入的E不全为1/0时按照上面的反过程就行。
2、当存入的E全为0时,那么真实的2E即21-127会非常的小,我们默认E=1-127,有效位M不再加上前面去掉的1,而是还原为0.XXXXXX的小数,表示接近于0的很小的数字。
3、同样当存入的E全为1时,表示无穷大。