最近在学习c语言,对浮点型数据的存储方式有些感兴趣,然后查资料了解了IEEE表示法:第一位是符号位0正1负,然后的八位是表示指数,最后23位表示尾数。对一个浮点数,首先将它规格化(就是整数部分为1的二进制表示),比如1.25就是1x20+1x2-2,就是1.01x20,它的指数部分为0,小数部分为0.01,小数部分就是浮点数的尾数部分,所以其尾数为0100000,00000000,00000000,00000000。至于为什么不保留整数部分的1,我想第一是为了多一位的精度,第二没必要,因为都规格化了整数部分都是1,然后是指数部分,指数部分要加上偏移量,我开始不明白,后面想明白了,如果没有偏移量,那么1.0和0.0的表示方法是一样的,会造成混淆,而计算机补码的0只有一种表示方法,怎么办?加上偏移量01111111就好了,这样我们把00000000,00000000,00000000,00000000定义为0,把00111111,10000000,00000000,00000000定义为1.0,而且这样00000000到11111111就是从小到大表示指数大小了,指数范围为(-127到128)所以浮点数的表示范围是2-126到2128。浮点数表示的精度为2-23=1.192e-7。既然知道原理,那就验证一下float x=1.0; unsigned int*p; p=(unsigned int*)&x; cout<<hex<<*p;
输出的结果为3f800000,结果和我们相的一样但如果我们使用char型指针,发现它的输出为00000000,00000000,10000000,00111111,这是为什么呢?因为计算机将变量存在栈中,栈是向下生长的
高地址 | 00111111 |
---|---|
10000000 | |
00000000 | |
低地址 | 00000000 |
这也告诉我们另一件事指针指向的是某一类型的低地址。
来源:CSDN
作者:huge king
链接:https://blog.csdn.net/ordinarybut/article/details/104875814