数据内存在C语言中的存储

文章介绍了C语言中基本数据类型如整型、浮点型、指针的存储细节,包括在Windows64位系统下的字节数。重点讨论了整数的原码、反码、补码表示,以及大小端模式对内存存储的影响。此外,还阐述了浮点数按照IEEE754标准的存储规则,包括符号位、有效数字和指数的表示。
摘要由CSDN通过智能技术生成

目录

前言

一.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解释例题

 四.结语:

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值