浮点型数据在内存中的存储

1.数据的类型

整型类型

char

signed char

unsigned char

short

unsigned short [int]

signed short [int]

int

signed int

unsigned int

long

signed long [int]

unsigned long [int]

long long

signed long long [int]

unsigned long long [int]

[ ]表示可以省略

浮点数类型

float

double

构造类型

数组类型

结构体类型

枚举类型

联合类型

指针类型

int*

float*

char*

void*

空类型

void

常用于函数返回类型、函数参数、指针类型

2.数据的存储

大小端字节序存储模式(小同大异)

什么是大端小端

大端存储:数据的低位储存在内存的高地址中,数据的高位储存在内存的低地址中

小端存储:数据的低位储存在内存的低地址中,数据的高位储存在内存的高地址中

为什么要有大小端

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

例如:int a = 0x11223344

小端存储:11是高位,存储在高地址,44是低位,存储在低地址;大端存储相反。

如何判断大小端

可以编写程序测试:

整型在内存中的存储

计算机中整数的表示方法有三种:原码、反码、补码

整数在内存中都是以补码的形式存储的。

因为这次测试的环境是小端存储,所以顺序不一样。

浮点型在内存中的存储

对于任何一个二进制浮点数都可以写成一种形式:(-1)^S*M*2^E,所以计算机只要将SME存储起来就可以了。

例如:

5(101)可以写成 (-1)^0*1.01*2^2

9(1001)可以写成 (-1)^0*1.001*2^3

那么在计算机中是如何存储的呢?

对于32位的浮点数,最高的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M。

对于64位的浮点数,最高一位是符号位S,接着的11位是指数E,剩下的23位是有效数字M。

对于M的规定:

M是一个大于1小于2的数,也就是说可以写成1.xxxxxxxx的形式,1可以省略,所以在存储时M只需要将小数位存起来就可以了。这样一来,32(64)位浮点数可以精确到24(53)位有效数字。

对于E的规定:

E是一个无符号整型数字,但是我们知道指数位可能出现负数,对于32(64)位浮点数,E只能表示0~255(0~2047)之间的数,所以规定,E在存储时要在真实值的基础上加上127(1023)。比如,2^10,E的真实值是10,在存储时+127(+1023)变为137(1033)。

E从内存中取出分三种情况:

1:E不全为0也不全为1

浮点数的E的真实值可以直接减去127(1023)即可得到

2:E为全0

E的真实值为1-127(1-1023),说明这是一个非常小的浮点数,这时M小数点前的1写成0,这样做是为了表示这个数是一个很接近于0的数。

3:E为全1

这时,如果M全为0,就表示+-无穷(+-通过S判断)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值