网站优化排名查询,phpcms企业网站源码,11号在线 网站开发,怎么建设一个淘宝客网站谁知道1. 浮点数
常见的浮点数#xff1a;3.14159、 1E10等 #xff0c;浮点数家族包括#xff1a; float、double、long double 类型。
浮点数表示的范围#xff1a; float.h 中定义.
2. 浮点数的存储
我们先来看一串代码#xff1a;
int main()
{int n 9;float* pFloa…1. 浮点数
常见的浮点数3.14159、 1E10等 浮点数家族包括 float、double、long double 类型。
浮点数表示的范围 float.h 中定义.
2. 浮点数的存储
我们先来看一串代码
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;
}
想一想输出结果是什么 出乎我们的意料。
原因在于浮点数的存储方式与整形有很大不同下面我们来看一下。 根据国际标准IEEE 电气和电子工程协会 754 任意一个二进制浮点数V可以表示成下面的形式 V (−1)S ∗ M ∗ 2E . (−1)S 表示符号位 当S0 V为正数 当S1 V为负数 . M 表示有效数字 M是大于等于1 小于2的 . 2E 表示指数位 举例来说 十进制的5.0 写成二进制是 101.0 相当于 1.01*2^2 。那么 按照上面V的格式 可以得出S0 M1.01 E2 十进制的-5.0 写成二进制是 -101.0 相当于 -1.01*2^2 。那么 S1 M1.01 E2。 IEEE 754规定对于32位的浮点数 最高的1位存储符号位S 接着的8位存储指数E 剩下的23位存储有效数字M ; 对于64位的浮点数 最高的1位存储符号位S接着11位存储指数E剩下的52位存储有效数字M 32位情况 64位情况 3。 浮点数的存储过程
IEEE 754 对有效数字M和指数E还有一些特别规定。
前面说过 1M2 也就是说 M可以写成1.xxxxxxx的形式 其中xxxxxxxxxx表示小数分。IEEE 754 规定 在计算机内部保存M时 默认这个数的第一位总是1 因此可以被舍去 只保存后面的 xxxxxx部分。 比如保存1.01的时候 只保存01 等到读取的时候 再把第一位的1加上去。这样做的目的 是节省1位有效数字。 以32位浮点数为例 留给M只有23位 将第一位的1舍去以后 等于可以保存24位有效数字。
至于指数E 情况就比较复杂首先 E为一个无符号整数unsigned int。这意味着 如果E为8位 它的取值范围为0~255如果E为11位 它的取值范围为0~2047。但是 我们知道 科学计数法中的E是可以出现负数的 所以IEEE 754规定 存入内存时E的真实值必须再加上 一个中间数 对于8位的E 这个中间数是127对于11位的E 这个中间数是1023。 比如 2^10的E是 10 所以保存成32位浮点数时 必须保存成10127137 即10001001。
4. 浮点数取的过程
指数E从内存中取出还可以再分成三种情况
4.1 E不全为0或不全为1
这时 浮点数就采用下面的规则表示 即指数E的计算值减去127或1023 得到真实值 再将有效 数字M前加上第一位的1。
比如0.5 的二进制形式为0.1 由于规定正数部分必须为1 即将小数点右移1位 则为1.0*2^(-1) 其阶码为-1127(中间值)126 表示为01111110 而尾数1.0去掉整数部分为0 补齐0到23位 00000000000000000000000 则其二进制表示形式为:
0 01111110 00000000000000000000000
4.2 E全为0
这时不用管E 浮点数的指数E直接等于1-127或者1-1023 即为真实值 有效数字M不再加上第一位的1 而是还 原为0.xxxxxx的小数。这样做是为了表示±0 以及接近于0的很小的数字。类似无穷小。
0 00000000 00100000000000000000000
4.3 E全为1
这时 即使有效数字M全为0 也表示±无穷大正负取决于符号位s
0 11111111 00010000000000000000000
我们学习了浮点数的存储下面我们回过头来看看前面的那道题目
5. 题目解析
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;
}
先看第1环节 为什么 9 还原成浮点数 就成了0.000000。 9以整型的形式存储在内存中 得到如下二进制序列0000 0000 0000 0000 0000 0000 0000 1001 首先 将9的二进制序列按照浮点数的形式拆分 得到第一位符号位s0 后面8位的指数E00000000。后23位的有效数字M000 0000 0000 0000 0000 1001。由于指数E全为0 所以符合E为全0的情况。 因此 浮点数V就写成 V(-1)^0 × 0.00000000000000000001001×2^(-126)1.001×2^(-146) 显然 V是一个很小的接近于0的正数 所以用十进制小数表示就是0.000000。
再看第2环节 浮点数9.0 为什么整数打印是 1091567616
首先 浮点数9.0 等于二进制的1001.0 即换算成科学计数法是 1.001×2^3
所以 9.0 (−1)0 ∗ (1.001) ∗ 23
那么 第一位的符号位S0 有效数字M等于001后面再加20个0 凑满23位 指数E等于3127130 即10000010。所以 写成二进制形式 应该是SEM 即
0 10000010 001 0000 0000 0000 0000 0000 这个32位的二进制数 被当做整数来解析的时候 就是整数在内存中的补码 原码正是1091567616。
感谢观看欢迎在评论区讨论。