数据类型及数据的储存

数据类型及数据的储存,第1张

目录

数据的基本内置类型

数据的分类

数据的储存

对于浮点型数据呢?

 那么我们又该怎样取出浮点数呢?


数据的基本内置类型
  1. char           //字符数据类型       1byte
  2. short          //短整型                  2byte
  3. int              //整型                      4byte
  4. long           //长整型                  4byte
  5. long long   //更长的整型           8byte
  6. float           //单精度浮点型       4byte
  7. double       //双精度浮点型       8byte

数据的分类

1.整型

char

        unsigned char    //无符号字符型

        signed char        //有符号字符型

short

        unsigned short    //无符号短整型

        signed short        //有符号短整型

int

        unsigned int    //无符号整型

        signed int       //有符号整型

long

        unsigned long    //无符号短整型

        signed long        //有符号短整型

long long

        unsigned long long    //无符号短整型

        signed long  long      //有符号短整型

2.浮点型

float

double

3.构造类型

数组

结构体

联合体

4.指针类型

int* pa;

char* pb;

float* pc;

voide* pd;

5.空类型

常用于函数的返回类型和参数,指针类型

数据的储存

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


其中对于正整数而言,他的原码,反码和补码是相同的。


让我们用实例进行探究。


int a=20;

其中20是属于 int 类型,已知 int 型在内存空间中消耗4个字节,也就是32个比特位,因此20在内存中的二进制序列为下;

 如果 int a=-20;

        现在我们已经知道了原码,反码和补码的二进制数列,那么数据在内存中是以什么形式存在的呢?

我们以一个简单的数据处理进行判断;

                计算(-1)-2的值

因为计算机处理数据时没有减法

所以计算机处理的数据应该是     (-1)+(-2)

假设他们是以原码的形式储存

-1的原码

1000 0000 0000 0000 0000 0000 0000 0001

-2的原码

1000 0000 0000 0000 0000 0000 0000 0010

相加得到

0000 0000 0000 0000 0000 0000 0000 0011

符号位的1与1相加,离开了内存空间,结果为3

所以不是以原码储存的

同理

-1的反码

1111 1111 1111 1111 1111 1111 1111 1110

-2的反码

1111 1111 1111 1111 1111 1111 1111 1101

(-1)+(-2)

1111 1111 1111 1111 1111 1111 1111 1011

-3的反码应该是

1111 1111 1111 1111 1111 1111 1111 1100

所以数据在内存中的储存方式也不是反码

那补码呢?

-1的补码

1111 1111 1111 1111 1111 1111 1111 1111

-2的补码

1111 1111 1111 1111 1111 1111 1111 1110

相加

1111 1111 1111 1111 1111 1111 1111 1101

对补码进行取反加一得到原码

1000 0000 0000 0000 0000 0000 0000 0011

结果为3,由此可知,整型数据在内存中储存的方式为补码;

对于浮点型数据呢?

        首先来看一段代码

你认为这串代码的结果是什么呢???

答案揭晓

 

         和你预想中的结果一样吗?根据这串小小的代码,相比我们就可以发现,浮点型数据的储存类型是完全不同与整型数据的。


        十进制;5.5

可以转化为

        二进制;101.1

浮点数的储存分为三个部分

        (-1)^s  * M * 2^E

二进制为101.1

(-1)^0 * 1.011 * 2^2

s=0   M=1.011   E=2

由于M一定是一个大于等于1,小于2的存在,所以M的第一位不在内存中储存,这样可以节省一位有效数字。


由于E是一个无符号整型,这意味着,如果E8位,它的取值范围为0~255,如果E11位,它的取值范围为0~2047


但是,我们 知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间 数是1023。


比如,2^10E10,所以保存成32位浮点数时,必须保存成10+127=137,即 10001001。


对于32位浮点数来说,S E M 的分布如下 

对于64位(double)型浮点数而言

 那么我们又该怎样取出浮点数呢?

        在取出浮点数时,我们不经要在M的最前面加上一个1,用S来判断浮点数的正负。


对于E,我们需要考虑三种情况。


1.E不全为0或不全为1         这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将 有效数字M前加上第一位的1


比如:         0.5(1/2)的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为 1.0*2^(-1),其阶码为-1+127=126,表示为 01111110,而尾数1.0去掉整数部分为0,补齐02300000000000000000000000,则其二进 制表示形式为: 0 01111110 00000000000000000000000 2.E全为0         这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,         有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。


这样做是为了表示±0,以及接近于 0的很小的数字。


3.E全为1 这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);         知道了这些,我们就可以来解释这个的输出结果了。


        整型9在内存中储存的补码为;0000 0000 0000 0000 0000 0000 0000 1001         将9的补码以浮点型来展开;则  S=0    E全为0    M=0.000000000000000001001 此时,E全为0;M不再加1,浮点数所表达的是一个接近于零的数,所以程序答应的结果为零。


        浮点数9在内存中的储存方式; 0 |10000010 |001 0000 0000 0000 0000 0000         以整型的方式来展开;将 0 |10000010 |001 0000 0000 0000 0000 0000作为补码计算; 原码为; 0 |10000010 |001 0000 0000 0000 0000 0000 此二进制代码表示的整数就是代码所打印的数。


        如果你能看到这里,我真的很感谢。


如果能点个赞再走,那就更好了。


我是个刚刚接触C语言的萌新,如果有纰漏之处,还请大佬斧正。


谢谢大家支持! 

                

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/564616.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-06
下一篇 2022-04-06

发表评论

登录后才能评论

评论列表(0条)

保存