数据的存储

本文详细介绍了数据类型的分类,包括整型、浮点型、构造类型、指针类型和空类型,并重点讨论了整型和浮点型在内存中的存储方式。整型采用原码、反码、补码的二进制补码形式存储,而浮点型遵循IEEE754标准,其中涉及指数E和有效数字M的特殊规定。理解这些基础知识对于深入理解计算机内部数据处理至关重要。
摘要由CSDN通过智能技术生成

主要介绍整型数据和浮点型数据的存储

类型的基本归类

整型分类

char:unsigned char、signed char
short:unsigned short 、signed short
int:unsigned int、signed int
long:unsigned long 、signed long
long long

浮点数分类

float
double

构造类型

数组类型 a[]
结构体类型 struct
枚举类型 enum
联合类型 union

指针类型

int *
char *
float*
void*

空类型

void(无类型)

数据类型的意义

1、决定了开辟的内存空间大小
2、看待内存空间的视角不同

整型数据在内存中的存储

原码、反码、补码

对于整型来说,数据在计算机中的存储是以二进制补码的方式存储的,所以在了解整型数据类型在内存中存储之前,我们先了解下原码、反码、补码。

原码:将二进制按照正负数的形式翻译成二进制就可以。
反码:原码的符号位不变,其他位依次按位取反就可以得到。
补码:反码+1就得到补码。
正数的原、反、补相同

例如:-1
-1的原码 10000000000000000000000000000001
-1的反码 11111111111111111111111111111110
-1的补码 11111111111111111111111111111111

计算规则

在计算机中,整型以二进制补码的方式进行计算,为什么呢?
原因如下:
1、使用补码,可以将符号位和数值域进行统一处理;
2、加法和减法也可以统一处理(CPU只有加法器);
3、补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

例如:1-1 ——>1+(-1)
在这里,我以32位计算机系统来进行计算
如果使用原码计算:
1的原码 00000000000000000000000000000001
-1的原码 10000000000000000000000000000001
相加得(-2) 10000000000000000000000000000010
很明显,结果是错误的

如果使用补码来计算:
1的补码 00000000000000000000000000000001
-1的补码 11111111111111111111111111111111
相加得(0)100000000000000000000000000000000(溢出,去掉1)

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

IEEE 754

浮点数和整数的存储规则并不一样,浮点数是以IEEE 754在内存中存储的。

根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数N可以表示成下面的形式: (-1)^S * M * 2^E
其中:
· (-1)^s表示符号位,当s=0,N为正数;当s=1,N为负数;
· M表示有效数字,取值范围大于等于1,小于2;
· 2^E表示N的指数位;

例如:
十进制的5.5,写成二进制是 101.1 ,相当于 1.011×2^2
那么,按照上面N的格式,可以得出S=0,M=1.011,E=2。

十进制的-5.5,写成二进制是 -101.1 ,相当于 -1.011×2^2 。那么,S=1,M=1.011,E=2。

IEEE 754规定

对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M
单精度浮点型
对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M
双精度浮点型

对于指数M和E的特殊规定

对于M的特殊规定

因为M的取值范围为:1≤M<2,所以M可以写成1.xxxxx的形式,xxxxx表示小数部分。
于是IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.011的时候,只保存011,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。

对于E的特殊规定

E被当成无符号整数,如果对于32位机器来说,E为8位,其取值范围为0—255;64位的话E为11位,其取值范围为0—2047,取值范围就非常大。
于是IEEE 754规定,存入内存时E的真实值必须再加上一个中间值后再存入E,对于8位的E,这个中间值是127;对于11位的E,这个中间值是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。
在这里插入图片描述

指数E的取出有三种情况:
(1)E不全为0或不全为1
用指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。即E=真实值+127
(2)E全为0
这时,浮点数的指数E等于1-127(或者1-1023)即为真实值
(±1.xxx * 1 / 2^-127),真实值非常非常小,几乎接近0,所以有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。
(3)E全为1
这时,E=255-127=128,即真实值非常非常大(±1.xxx * 1 / 2^128),所以表示±无穷大(正负取决于符号位s)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值