189 8069 5689

数据内存在C语言中的存储-创新互联

目录

成都创新互联公司是专业的定远网站建设公司,定远接单;提供成都做网站、成都网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行定远网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

前言

一.C语言的基本数据类型介绍

  1.1整形家族

​编辑

1.2浮点型家族

  1.3指针类型

  1.4构造类型

  1.5空类型void 

二.整形在内存中的存储

2.1原码,反码,补码

  2.2大小端的介绍

三. 浮点数的存储

3.1举一个例子

3.2浮点数存储规则

3.3解释例题

四.结语:


前言

新年的第一篇博客,记录一下新一年的学习8。

大家都知道数据在计算机中是用二进制进行存储的,一个字节由8位二进制数组成。那数据在C语言存储的细节是怎么样的呢?这篇文章就带大家讨论这个问题。

一.C语言的基本数据类型介绍         1.1整形家族

在windows64位系统中,long long 占8个字节,long占4个字节,int占4个字节,short占2个字节,char占1个字节。

为什么要把char归入整形家族呢?因为字符数据在c语言中本质储存的ASCII码,而ASCII码是整数,所以存储方式与整数一致。

1.2浮点型家族

在windows64位系统中,float占4个字节,double占8个字节。

  1.3指针类型

指针类型(当然指针类型不只这些,这里没有列举完) ,在64位系统下占8个字节,32位系统下占4个字节。

  1.4构造类型

这些类型的存储要根据内部的数据类型计算,这里就不做详细描述

  1.5空类型void 

void表示无类型(空类型)。

通常应用于函数的返回类型、函数的参数、指针类型。
二.整形在内存中的存储         2.1原码,反码,补码

什么是原码呢?

原码就是整数直接转换成二进制后形成的二进制序列。如下图所示。

因为a是int类型,int类型由4个字节组成,所以它转换成二进制后的源码应该由32位二进制组成。

在C语言的规定中,正整数的原码、反码、补码是相同的。

PS:它是怎么知道正负的呢?在c语言中,数据的原码首位字符代表正负(0为正,-1为负)。

看完了正数的原反补,现在我们来看负数。

负数的原码与整数一样,都是由数字转化为二进制得到,与正数不同的是,它的第一位是1,也就是符号位为1。

它的反码怎么得来呢?

负数的反码由原码转化而来,规则是:符号位不变,其他位依次按位取反得到。补码则是反码加一得到。

但是数据中为什么要存在原码、反码、补码呢?

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统 一处理; 同时,加法和减法也可以统一处理( CPU 只有加法器 )此外,补码与原码相互转换,其运算过程 是相同的,不需要额外的硬件电路。 原因如下图所示:

我们也可以验证一下,我这里查看的是VS2022中的内存存储。

但是我们看到内存存储的顺序又存在一些问题,它好像是倒着存储的。

这又是什么原因呢? 

  2.2大小端的介绍

什么是大小端:

大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中; 小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位 , ,保存在内存的高地 址中。

PS:0x就是十六进制的意思。

这里我们可以看到数据的存储是倒着存的。

这里的11是低位数据存在低地址处,44是高位数据存在高地址处。

便于记忆可以简单的理解为,小端是倒着存,大端是正着存。

三. 浮点数的存储 3.1举一个例子

为什么会出现这样的情况呢?

3.2浮点数存储规则 根据国际标准 IEEE (电气和电子工程协会) 754 ,任意一个二进制浮点数 V 可以表示成下面的形式: (-1)^S * M * 2^E PS: (-1)^S 表示符号位,当 S=0 , V 为正数;当 S=1 , V 为负数。 M 表示有效数字,大于等于 1 ,小于 2 。 2^E 表示指数位。 这个是什么意思呢? 这里举个例子比如5.5可以表示为:(-1)^0*1.011*2^2 这个算式怎么的出来的呢? 首先把5.5转化为二进制101.1 再转化成科学计数法表示也就是1.011*2^2

IEEE 754对有效数字M和指数E,还有一些特别规定 

因为在浮点数中M永远都是大于等于1小于2的,所以E最前面的1没有必要存储,这样可以多一位精度。

至于指数 E ,情况就比较复杂。 首先, E 为一个无符号整数( unsigned int ) 这意味着,如果 E 为 8 位,它的取值范围为 0~255 ;如果 E 为 11 位,它的取值范围为 0~2047 。但是,我们 知道,科学计数法中的E 是可以出 现负数的,所以 IEEE 754 规定,存入内存时 E 的真实值必须再加上一个中间数,对于 8 位的 E ,这个中间数 127;对于 11 位的 E ,这个中间 数是 1023 。比如, 2^10 的 E 是 10 ,所以保存成 32 位浮点数时,必须保存成 10+127=137 ,即 10001001 。 也就说在存储E时要加上127再进行存储。 其次就是E如果为全1或者全0

如果E为全一为无穷大(正无穷与负无穷),如果E为全0代表无穷小(无限接近于0)

如果E中有1也有0,那就正常计算即可。

3.3解释例题

四.结语:

数据的存储就讲完了,如果有哪里讲的不严谨,欢迎大家来讨论。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享名称:数据内存在C语言中的存储-创新互联
新闻来源:http://cdxtjz.cn/article/hhgic.html

其他资讯