整形和浮点数在内存中的存储

 

创建一个变量,系统便会自动为其在内存上开辟一块空间,空间的大小根据类型的不同而不同。那么数据在所开辟的内存空间中如何存储的呢?


一、整形在内存中的存储

1.原码补码反码

1.1概念

原码:一个数的二进制序列

反码:符号位不变,对原码按位取反(符号位:0表示正数,1表示负数)

补码:反码加一

例:10的原码反码补码如下:

1.2在计算机系统中,为了使硬件更加简单,数值一律采用补码的方式来存放(用16进制来表示)

①可以将符号位和数值域统一处理;

②加法和减法也可以统一处理(CPU只有加法处理器)

③补码与原码相互转换,其运算过程是相同的。

           原码取反+1->补码 

           补码取反+1->原码

2.字节序

在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一 个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具 体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

内存中的实际内容是按照16进制表示的,1个16进制是4个bit位,2个16进制是8个bit位,刚好是一个字节。

2.1小端字节序:高位放在高地址(小小小,地位,低地址,小端)

2.2大端字节序:高位放在低地址

一台机器的字节序取决于CPU,两种字节序的机器都是存在的,只不过小端字节序的机器在PC上是主流~

二、浮点数在内存中的存储

关于int 在内存中占几个字节:和系统有关。

关于float和double在内存中占几个字节:IEEE 754标准规定了浮点数是怎么存的

1.Float

(单精度浮点数存储模型)

2.Double

(双精度浮点数存储模型)

3.比较Float和Double

上图中,S是符号位(0表示正+,1表示负-),E指数部分,M有效数字

即:+/- M*2^E

M占用的bit位越多表示的数据精度就越高;E占用的bit位越多表示的数据范围就越大

double的精度和范围都比float大,实际开发中优先考虑double

浮点数在内存中存储的时候,很多时候都是有误差的。在实际开发中,不能使用浮点数之间进行==比较;如果需要判定浮点数相等,就需要做差,然后看差值是否是一个小于预期误差的值。如果误差符合我们的要求,就可以近似认为是相等的。

要求绝对精度的时候,要避免使用double和float~~

 

猜你喜欢

转载自blog.csdn.net/weixin_43939602/article/details/109675157
今日推荐