目录
一、整数的存储
1、有符号整形的存储
在平常的算术中,我们知道1+1=2,那么在计算机中又是怎么计算出1+1=2的呢?在计算机中的计算,首先要将数都变为补码进行运算,运算完之后再转化为原码,而在c语言中,int类型的存储大小为2^-32~2^32,char类型是-127~128,今天我们以char类型为例:
#include<stdio.h>
int main(){
char a=1,
char b=128,
char c=257;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
我们打印出来的结构是
,为什么呢?以图为例:
我们根据图可以知道当当补码01111111+1之后变成了10000000 ,而在有符号char类型中,后7位为数值为,第一位为符号位,而10000000变为原码之后就变成了-128,而,对于char c=257;因为已经超出了范围,当c=255时,c的补码为11111111,而当c=256时,变为100000000,但char类型只能保存8个比特位,所以1就溢出,256就变成了00000000,257则变成了00000001,所以c=1;
2、无符号整形的存储
而对于无符号整形的存储方式其实和有符号整形的图是一样的,不同的是,无符号整形没有符号位,只有数值位,所以无符号整形没有负数,为了更好的说明,我们还是以unsigned char作为一个参照:(以图为例)
在无符号的char类型中,取值范围是0~255,而当大于255的时候,又是从0开始,由于是整数的原因,补码和原码的取值是一样的,所以127+1还是变成128.
二、浮点数的存储
1、浮点数的存储格式
根据国际标准IEEE(电器和电子工程协会)754,任意一共二进制浮点数V可以表示下面的形式:
V=(-1)^S*M*2^E;
(-1)^S表示符号位,当S=0,V为正数,当S=1,v为负数
M代表要有效数字,M是大于等于1,小于2的
2^E表示指数位。
浮点数的存储,其实存储的就是S,M,E相关的值
2、浮点数的存储过程
我们已经知道浮点数的存储格式,那么我们是如何存储浮点数的呢?以5.5的存储为例:
5.5写成二进制就是101.1=1.01*2^2,我们知道V=(-1)^0*1.011*2^2;S=0,M=1.011,E=2,但是存储在SEM的格式中E需要加上128,所以5.5以SEM的存储方式变成0 10000010 01100000 00000000 0000000