数据在内存中的存储

一·整数在内存中的存储

在前面操作符详解时,提到:
整数的二进制表示方式有两种:原码,反码,补码
1.正数的原反补相同,负数不同(各种转换请看前面的《操作符详解》);
2.对于整型来说:数据存放内存中其实存放的是补码。

二·大小端字节序和字节序判断

1.超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为⼤端字节序存储和⼩端字节序存储。
2.在计算机系统中,我们是以字节为单位的,每个地址单元都对应着⼀个字节,⼀个字节为8bit 位,但是在C语⾔中除了8 bit 的 char 之外,还有16 bit 的 short 型,32 bit 的 long 型(要看具体的编译器),另外,对于位数⼤于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度⼤于⼀个字节,那么必然存在着⼀个如何将多个字节安排的问题。因此就导致了⼤端存储模式和⼩端存储模式。
在这里插入图片描述
如何判断大小端存储?
思路:
将整型转化成char型,就可以一个字符一个字符访问。
但注意不能直接强制类型转成char
要先取地址,将地址转成char*,再解引用看第一个字符。
在这里插入图片描述

三·来点例题

1.在这里插入图片描述
2.在这里插入图片描述
在这里插入图片描述

易错:
在这里插入图片描述
注意:就算是128,用%u打印,还是一步步按上面分析来,过程一样,不可主观臆断认为是128。
3.
补充知识:在这里插入图片描述
signed char:-128~127
unsigned char:0~255

在这里插入图片描述
4.几点要注意的:
出现字符串类型的数一定注意!看他们的范围!!!
在这里插入图片描述
5.
在这里插入图片描述

四·浮点数在内存中的储存

浮点数表⽰的范围: float.h 中定义
举个栗子
在这里插入图片描述
为啥单独打印整型时整型对,浮点型数不对;反之也不对呢?
—>其实是因为浮点型与整型的存储方式不一样。
在这里插入图片描述
⼗进制的5.0,写成⼆进制是 101.0 ,相当于 1.01×2^2 。
那么,按照上⾯V的格式,可以得出S=0,M=1.01,E=2。
⼗进制的-5.0,写成⼆进制是 -101.0 ,相当于 -1.01×2^2 。那么,S=1,M=1.01,E=2。

IEEE 754规定:
1.对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
2.对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
在这里插入图片描述
注意:
1.对于M:
在计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,只保存后⾯的
xxxxxx部分
。⽐如保存1.01的时候,只保存01,等到读取的时候,再把第⼀位的1加上去。这样做的⽬
的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保
存24位有效数字。
2.对于E:
E是无符号整数
这意味着,如果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。
(1)E有0有1:
按上面规则加
(2)E全为0:表示接近0的无穷小数;
(3)E全为1:表示接近无穷大的数。

所以回过头再看那个题:
9的二进制序列:
0000 0000 0000 0000 0000 0000 0000 1001
按照浮点型拆开–>为正数,E全为0,V=(-1)^0 × 0.00000000000000000001001×2^(-126) =1.001×2^(-146)
接近于0,所以打出来是0.000000.
9.0 = (−1)^0*(1.001) ∗ 2^3
3+127=130
0 10000010 001 0000 0000 0000 0000 0000写出来就是1091567616

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值