C语言中的数据的存储

本文介绍了C语言中数据在内存的存储方式,重点关注整形和浮点数。整形以二进制补码的形式存储,遵循小端或大端规则。浮点数遵循IEEE754标准,32位和64位有不同的存储结构。讨论了E、M值的确定及其意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、整形在内存中的存储

数据在内存中是以二进制补码的形式存储的 。下面来介绍原码、反码、补码的概念。

正数的原码、反码、补码相同。

负数求值如下:

原码
直接将数值按照正负数的形式翻译成二进制就可以得到原码。
反码
将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码
反码 +1 就得到补码。

eg:

 由上图可知:整形在内存中是以补码的形式存储的,但是实际在内存中的顺序是不一样的。

原因是:按照小端存储的,什么是小端?

由图可知小端为:二进制底权放入低地址处高权放在高地址处。 

但是取出用的时候是二进制补码

既然了解了小端,那么大端又是怎么样的呢?

大端与小端相反,它是底权放入高地址处高权放在低地址处。

二、浮点数在内存中的存储

任意一个二进制浮点数V可以写成如下形式:

(-1)^S * M * 2^E
(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
M表示有效数字,大于等于1,小于2。
2^E表示指数位。
以浮点数5.5何-5.5为例:

IEE754规定:

32位的时候是这样存储的:

 64位的时候是这样存储:

 S、E、M的值又是怎么确定的呢?

M是去掉小数点前面的一保留小数点后面的二进制数。为什么这么做呢?

答:是节省 1 位有效数字。以 32
浮点数为例,留给 M 只有 23 位,
将第一位的 1 舍去以后,等于可以保存 24 位有效数字,这样就可以更精确了。

IEEE754规定 :1<= M <2 。

对于E的在内存中的存储比较麻烦。

首先, E 为一个无符号整数( unsigned int
这意味着,如果 E 8 位,它的取值范围为 0~255 ;如果 E 11 位,它的取值范围为 0~2047
但是,我们 知道,科学计数法中的E 是可以出 现负数的,所以IEEE 754 规定,存入内存时 E 的真实值必须再加上一个中间数,对于 8 位的 E ,这个中间数 是127 ;对于 11 位的 E ,这个中间 数是1023
比如,2^3 E 是3 ,所以保存成 32 位浮点数时,必须保存成3 +127=130 ,即 10000010。
取出又分为三种情况:
E 不全为 0 或不全为 1
E 全为 0
这时,浮点数的指数 E 等于 1-127 (或者 1-1023 )即为真实值,
有效数字 M 不再加上第一位的 1 ,而是还原为 0.xxxxxx 的小数。这样做是为了表示 ±0 ,以及接近于
0 的很小的数字。
0 01111110 00000000000000000000000
E 全为 1
这时,如果有效数字 M 全为 0 ,表示 ± 无穷大(正负取决于符号位 s );

看下面的例题:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值