对于整形和浮点型在机算计中的存储

*整形

整形:(char,int,unsigned char,unsigned int…)
整形分为有符号整形和无符号整形。
有符号整形
有符号整形在计算机中直接存储他的原码(即将这个数转换为二级制数的二进制码)
例如:

unsigned int  a = 0;
a = 9;
//a转换为9的二进制形式为 1001,故在计算机中的存储形式为: 1001

因为这是int 型所以计算机开辟4个字节来存储,存储格式为:
0000 0000 0000 0000 0000 0000 0000 1001
如果a为char类型则开辟1个字节来存储,存储格式为:
0000 1001
通过这个我们也可以看出int型和char型有明显的最大存储值(即所有bit位都为1),我们不妨让他都为1先看一下;
int 1111 1111 1111 1111 1111 1111 1111 1111(232-1)
char 1111 1111 (28-1)
因此我们可以看出unsigned int 的存储范围为[0,232-1];
unsigned char 的存储范围为[0,28-1]。

无符号整形
这里要先解释一下什么是反码,补码,和无符号整形的存处规定。
无符号整形规定开辟字节的第一个bit位为符号位 正数取0,负数取1。
反码:原码的符号位不变其余bit位按位取反。
补码:反码加一(符号位参与运算)
即:补码 = 反码 + 1
无符号正数的存储:
无符号正数直接存储它的原码(第一个bit位必须位0)
例如:

char a = 5//a的原码是101,所以在计算机中的存储格式为 0000 0101;

无符号负数存他的补码,
例如:

char a = -9//a的原码是  1000 1001
//故  反码 :1111 0110
//故  补码: 1111 0111
//所以此时a在计算机中的存储为:1111 0111

由于符号位的存在我们可以发现计算机中在存储有符号整形的时候出现了两个0,即+0(0000 0000) 和-0(1000 0000)这样就使得0值不唯一,破坏了值的唯一性。因此我们规定当存储格式为
(1000 0000)的时候他不在表示-0,而表示-128.
当计算机存无符号正数的时候由于符号位必须为0,所以无符号正数的最大值为(0111 1111即127)
所以char 在计算机中的存储范围为[-128,127],同理 int 的存储范围为[-232,232-1]。

浮点型

浮点型:float,double…
浮点型在计算机中的存储格式为(-1)S ×M× 2E
解释:就像科学计数法是M×10n一样, 后面的M×2E就是将浮点数转换为二进制的科学计数法,M∈[1,2],前面的S确定他的符号位负数取1正数取0和整形一样。计算机在存储的时候只需要看S,M,E的值就好了。其中S占第一位,E占S后面的8位(2-9位),M站剩余的23位。因为E有正负我们没有给他留符号位,所以规定E存储的时候+127,读取的时候-127.
例如:

float 5.0
//5.0  = 101.0 = 1.01*2^2^ = (-1)^0^×1.01×2^2+127^ =  (-1)^0^×1.01×2^129^
//即存储格式为:
//0 100 0000 1 010 0000 0000 0000 0000 0000
//S|   E      |              M              |

我们发现M区的数是1.01存的却是01,因为M区一个范围是1到2第一个肯定是1,所以不用继续存储,节省一个字节的空间。

当E为全1的时候表示∞,当E为全0的时候表示0(不管M取多少),表示0。
double类型只是将E,M的字节长度变大(E占11个bit位,M占52个bit位),E加的值变为1023,其余不变。
现在就整形和浮点型各举一个例子说明:

//整形
int a = -5;
printf("%u",a);
//a = -5 有符号所以他的存储格式为1111 1111 1111 1111 1111 1111 1111 1011
//读取的时候按无符号读取,即直接翻译1111 1111 1111 1111 1111 1111 1111 1011 
//此时a = 4294967291
//浮点型
float a = -5.0;
int *p = &a;
printf("%d",*p);
//a = -5.0浮点型所以他的存储格式为1100 0000 1010 0000 0000 0000 0000 0000
//读取时读取指针p所指向的内容,即&a,这里是在32位系统下定义的p,所以p占4个字节
//此时 *p = 1100 0000 1010 0000 0000 0000 0000 0000 按整形读取
//1011 1111 0101 1111 1111 1111 1111 1111 + 1
//1011 1111 0110 0000 0000 0000 0000 0000
//程序结果为:-1063256064
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值