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

1.整数在内存中的存储

整形数据存放内存的其实是补码,好处是可以将符号位和数值域统一处理。

1.1原码 反码 补码

以上三种为整数的2进制表示方法,包含符号位和数值位两部分。符号位0为正,1为负,数值为最高位的一位视为符号位,其余都是数值位置。

正整数的原、反、补码都相同。
负整数三种表示方法则各不相同。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的 符号位不变 ,其他位依次 按位取反 就可以得到反码。
补码:反码+1就得到补码。
负整数例子:-21。原码10010101,反码11101010,补码11101011.
小结:
1.因为一字节是八位,所以十进制转换为二进制后,要补满八位
2.8位的二进制表示范围为[-128,127],超出范围则会溢出,只能用两个字节,16位二进制表示
3.-128补码为1000 0000

2.浮点数在内存中的存储

浮点数表⽰的范围: float.h 中定义
常见浮点类型: float double long double 类型

2.1例题引入

#include <stdio.h>
int main()
{
 int n = 9;
 float *pFloat = (float *)&n;
 printf("n的值为:%d\n",n);
 printf("*pFloat的值为:%f\n",*pFloat);
 *pFloat = 9.0;
 printf("num的值为:%d\n",n);
 printf("*pFloat的值为:%f\n",*pFloat);
 return 0;
}

输出的结果

相同的数字,但浮点型和整形的解读结果差别很大,实际是因为浮点数在计算机内部的表示方式不同。

2.2国际标准定义存储

根据国际标准IEEE(电⽓和电⼦⼯程协会) 754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式

2.3标准解析

浮点数在计算机内有两种存储的精度,即单精度(32位),双精度(64位)。
符号S:0为正,1为负
尾数M:小数点后面的部分(十进制转换为二进制后,使用科学计数法的小数部分)
指数E:即阶码,指明了小数点在数据中的位置
为了让指数表示正负,引入了偏差码,float的为127,double的为1024
E的情况又分为三种:1.E不全为0或不全为1:指数E的计算值减去偏差码,得到真实值2.E全为0:指数E等于1-偏差码即为真实值,有效数字M不再加上第⼀位的1,⽽是还原为0.xxxxxx的⼩数,表示±0以及接近0的数值。3.E全为1,若M全为0,表示±⽆穷⼤

2.4如何转化

整数部分:直接转化为二进制
小数部分:不断乘以2,再取整,把整数部分拿出,再重复以上操作,取到自己想要的精度后,从上往下读
整体:全部转化为二进制后,转为科学计数法表示

2.4.1举例:

十进制小数:5.25
整数部分:5   101
小数部分0.25从上往下取
                0.25*2=0.5   0
                0.5*2=1.0     1
转为二进制:101.01
科学计数法:1.0101*2的2次方(向后移2位)
S:0
E:2      127+2=129实际指数
M:0101
在内存中实际存储
E部分转化为二进制,M后续用0补充满,129的二进制为1000 0001.

2.5疑问解答

当是整型9时,
二进制序列串为:0000 0000 0000 0000 0000 0000 0000 1001
按照浮点数拆解:S=0,E=0000 0000,M=00000000000000000001001
符合E全为0的情况。表示很接近0的整数,即十进制表示为0.000000,
浮点数打印为: 1091567616 
9.0二进制为1001.0,科学计数法:1.001×2^3 
转化为二进制串即为: 0(S) 10000010(E) 001 0000 0000 0000 0000 0000(M)
被当做整数的补码来解析时,原码为1091567616 
  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值