整数的储存规则
正整数
正整数 在计算机中 是以原码的形式 存储的。你也可以说是 补码 或者 反码,因为 正整数的 原码,反码 和补码 是一样的。
负整数
负整数 在计算机中 是以 补码的形式 存储的。 负数的 补码 = 负数的 反码 (即原码 的 非 符号位 取反) + 1
浮点数的储存规则
根据IEEE(电气电子工程师学会)754标准,一个任意的二进制浮点数可以表示成下面这种形式
(-1)^S * M * 2^E
1.其中(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数
2.M表示有效数字,范围为大于等于1,小于2
3.2^E表示指数位
规定32位的浮点数的符号位是S,接着的8位是E,最后的23位是M
规定64位的浮点数的符号位是S,接着的11位是E,最后的52位是尾数M
对于存储浮点数特别规定:
1.因为有效数字M为1.xxxx,所以规定 存储时的尾数M是有效数字去掉1后的二进制序列
2.因为指数位E可能为负数,所以规定存储时的阶码E是指数位E偏移量,对于32位浮点数来说,偏移量是127,对于64位浮点数来说偏移量是1023
对于取出浮点数时特别规定:
1.E不全为0或1
因为存储浮点数时将有效数字的1去掉了,所以正常情况下取出浮点数的有效数字时需要将去掉的1补回来,取出浮点数的指数位时需要将内存存储的E减去偏移量,才能得出原本的E。
2.E为全0的情况
取出来时,要把E还原成真实指数值需要在E的基础上减去偏移量,如果E全为0,那么指数值为1-127或1-1023
此时有效数字M不在加上第一位的1,而还原成0.xxxxx这样的小数
这样做是为了更好的表示±0以及接近于0很小的数字
3.阶码E全为1
如果E全为1,真实指数值就是E的值加上偏移量,最后的还原出来的小数在float类型里面表示是±无穷大(正负取决于符号位S)
#include<stdio.h>
int main()
{
int a = 9;
float* b = (float*) & a;
printf("a = %d\n", a);
printf("float* b = %f\n", b);
*b = 9.0;
printf("a = %d\n", a);
printf("float* b = %f",*b);
return 0;
}
以float类型来看所存储的整型9
00000000 00000000 00000000 00001001
根据取浮点数的规则,此时E为全0,所以打印的结果为0.000000
在根据浮点数的储存规则9.0的二进制应为
0 10000011 00100000000000000000000
根据取正整数值的规则,此时a为1091567616,所以打印结果为1091567616