数据类型及数据的储存

本文详细探讨了C语言中数据类型的基础知识,包括整型、浮点型的分类、内在表示和储存方式。重点分析了整型数据在内存中以补码形式储存,并解释了浮点数的存储结构,如32位和64位浮点数的布局。同时,通过实例解释了如何从内存中取出浮点数。

目录

数据的基本内置类型

数据的分类

数据的储存

对于浮点型数据呢?

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


数据的基本内置类型

  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语言的萌新,如果有纰漏之处,还请大佬斧正。谢谢大家支持! 

                

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

能飞多远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值