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可以表⽰成下⾯的形式
![](https://i-blog.csdnimg.cn/direct/35177b71e89442a280b18ae74c6427be.png)
2.3标准解析
浮点数在计算机内有两种存储的精度,即单精度(32位),双精度(64位)。
![](https://i-blog.csdnimg.cn/direct/61e8f88978a941b592862f4d6171da39.png)
符号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
在内存中实际存储
![](https://i-blog.csdnimg.cn/direct/c19fee8fcb764940bdeaa91b063098eb.png)
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