位制转换的问题----%f %d 对int型 double型转换期间的问题
来源:互联网 发布:淘宝登录优酷会员 编辑:程序博客网 时间:2024/06/06 22:45
对于这样的程序输出结果
#include<iostream>
using namespace std;
int main()
{
printf("%f",5);
printf("%d",5.01);
}
我的分析是这样的:首先注意(栈中的数字是从高位向地位存储的!比如 int a=3;&a指的是低位地址 不是高位地址,即是int的末尾 而不是int的开头位置。)
其实,在我们当我们弄清楚浮点数的存储格式之后,就会明白其中的奥妙了。 在C语言标准中,浮点数是采用IEEE754标准 float类型数据存储格式如下:
最高位最低位符号S 阶码E 尾数M 最高位 31 位 ,保存符号位 S“, 0”表示正数 ,“1”表示负数 30 位~23 位 ,共 8 位 ,移码方式(指数值加上偏移量127)保存指数部分 ,称为阶码 22 位~0 位 ,共 23 位 ,保存系数部分 ,称为尾数 ,对于规范化二进制数 ,整数位的前导“1”不保存 。
隐含 直接保存小数部分 对于 double 型 ,IEEE 754 - 1985标准规定用64 位表示 ,具体如下: ·最高位63 位 ,保存 S“, 0”正数“, 1”负数; ·62 位~52 位 ,共 11 位 ,移码方式(指数值加1023)保存指数 ,称为阶码;
·51 位~0 位 ,共 52 位 ,保存系数部分 ,称为尾数 ,对于规范化二进制数 ,整数位的“1”不保存隐含) ,直接保存小数部分 将5.01压入栈,为double的数,栈8个字节。
另外%f是按double来输出的
对于 printf("%f",5) 首先5是int型的 在内存中占有4B,而输出确要是8B个字节,5在内存中为0000 0000 0000 0000 0000 0000 0000 0101 按%f输出还必须加入0000 0000 0000 0000 0000 0000 0000 00000000 0000 0000 0000 0000 0000 0000 0101 才行,由于double类小数点后面只保留6位,所以不可能取到有非0的101处,所以答案为0.000000
对于printf("%d",5.01) double型5.01占有内存8B,而%d只取高4B,由于高4B存放的是符号位和阶码,5.01在内存按纯小数存放时肯定是0.501000 所以真正的阶码位是不为0的 ,这里是指最后换算后,而不是指按移位来说阶码,是指我们真正需要的数字。而我们需要的是低4B的数字,由于低4B存放的是小数0.501000的二进制表示,但是按%d输出时会转换为整数,所以输出为1889985710
我是这样理解的 不知道对不对 哎:要是汇编和编译原理学好了该多好啊,这样就可以直接看最底层就一目了然了!
希望大家批评指正!!!!
- 位制转换的问题----%f %d 对int型 double型转换期间的问题
- unsigned int 和double 转换中出现的问题
- int 型 char 型的转换问题
- java 的long转换double问题
- double和float转换的问题
- 经得起雷劈:关于double和int/long相互转换失去精度计算错误的问题
- 经得起雷劈:关于double和int/long相互转换失去精度计算错误的问题
- 关于int,double 到string的转换
- CString与double int间的转换
- int, double, string的转换函数
- int, double, string的转换函数
- double到int的快速转换
- swift字符串、int、double之间的转换
- string与double,int的转换
- double到int的快速转换
- 解决 java double 减 int 型 产生的精度问题
- CString string char* int的转换问题!!
- int 到 char的转换问题
- jquery ajax请求返回xml,html,text,json,..数据实例详解
- C#泛型类之LIST<T>
- 使用jsoncpp解析JSON数据(转)
- 名企经典面试题
- 至多只用一个变量就可以输出九九乘法表
- 位制转换的问题----%f %d 对int型 double型转换期间的问题
- CUDA: GPU的硬件架构
- C++循环赛日程表算法
- Free E-books on Programming from stackoverflow
- php 小问题集合
- 组件和接口
- java.lang.IllegalArgumentException: Invalid uri ......
- Android 4.2 Wifi Display 之 Settings 源码分析(一)
- 3G、WiFi、WLAN、蓝牙、zigbee区别