C++ 从float到int
来源:互联网 发布:a5网站源码 编辑:程序博客网 时间:2024/04/27 19:19
C++ 从float到int
引言
一次在写代码的时候,天真的将一个double强行转换到int,以为能够得到double中的整数部分,结果却得到0。那个时候挺费解,就去查了一下double的存储方式,才发现浮点型的存储方式和int的是大相径庭。整理一下资料,简单介绍一下浮点这种存储方式,希望能够帮助到一些朋友。
一、浮点的存储方式
在C++中一个float是32位,一个double是64位,这两种数据类型的存储方式是一样的。所以为了讨论方便,这里就介绍float。
先来看看float每一位代表什么意思。
符号位占一位,这个应该不用解释; 阶码位和尾数位,这里我用一个例子来解释:
比如float f = 12.125;
这里我们将这个float拆成两部分12 和 0.125。12转换成二进制就是1100;0.125转换成二进制0.001。所以12.125我们可以这么标识1100.001,然后使用科学计数法表示:。
首先来计算阶码,这里的指数为3,然后阶码就是127 + 3 = 130,这里我们为什么加上127,稍后做解释,130转换为二进制便是10000010。
然后开始得到尾数,尾数很简单,先获取科学计数法中小数点后面的部分100001,然后将位数补全,因为这里尾数是23位的,所以在100001后面再补上17个0,就是1000010 00000000 00000000。
我们整个来看一下这个float(它的符号位位0):
0 10000010 1000010 00000000 00000000
整理一下便是
二、整型的存储方式
整型的存储方式相对来说就简单很多,这里就介绍一下整型是怎么处理负数的。
这里还是举例子说明,比如int i = -1;
这里先不管符号,1(10) = 00000000 00000001(2),对其每一位求反~( 00000000 00000001) = 11111111 11111110。然后再加上1便得到11111111 11111111,这个便是-1用整型方式存储的结果。
所以一个负数,首先去去掉符号,将其转换成二进制,然后对二进制的每一位求反,最后加1。
三、double到int
对于float直接强行转换为int,我在VC++的平台下运行,竟然是正确,估计内部帮忙完成了转换。所以这里我举一个double到int的例子。
这里稍微介绍double的存储。
还是12.125,double d = 12.125;举一个例子:
。
符号位:0
阶码位: 1023 + 3 = 1026,注意这里的基数不在是127而是1023。1026(10) = 10000000010(2)。10000000010便是阶码位。
尾数位:100001补齐51位
100 00100000 00000000 00000000 00000000 0000000000000000这个尾数位。
下面的代码便是将double转换成int,这个代码后面会进一步改进:
bool ConvertToInt(constdouble & val,int& i){ int num[2] ={0}; memcpy(num,&val,8); int high =num[1]; int nExp =((high>>20)&0x7ff) - 1023; if(nExp<= 20) { i = ( high&0xfffff |0x100000)>>(20 - nExp); } else if(nExp > 20 && nExp <= 30) { int low= num[0]; i = ( ( high&0xfffff |0x100000)<<(nExp - 20) )+ ( low >>(52 - nExp)); } else return false; if(high&0x80000000) i = ~i + 1; return true;}
四、阶码解释
在第一节中,我们计算阶码的时候,我们指数 + 127为什么是127而不是0,这里是因为我们还要考虑指数为负数的情况,比如下面这个情况:
float f = 0.125;
0.125(10) = 0.001(2) = 这里我们得到的指数是-3,所以阶码是127– 3 = 124。127是八位阶码能够取到的中间值。
五、浮点数的范围
这里先介绍一个浮点数的约定,就是下面的三种情况
(1) 阶码位0,尾数位0,那么这个浮点数表示0;
(2) 阶码位255,尾数位0,那么这个浮点表示无穷大;
(3) 阶码位255,尾数位不为0,那么这个是一个非法数。
在第一节中介绍的浮点存储结构和上面介绍的三个约定:
其中最大阶码便是254,因为255有特殊作用,所以能够得到的最大指数便是127。
所以浮点型能表示的最大正数是: ,上面这个值约等于:
最小的阶码便是0,所以得到的指数便是-127。所以一个浮点的最小正数应该是,上面这个值约等于:
- C++ 从float到int
- 实现从float到int的强转
- [C++]string到double,float,int的转换
- C语言中int到float的强制类型转换
- C语言中int到float的强制类型转换
- c语言中int到float的缺失问题解决
- float到int类型转换
- C语言的int, float,double相互转化(从本质上理解可能的问题)
- C语言中int到float的强制类型转换(转)
- VS2008中的字符串到int、float
- 从“double”到“float”截断
- 从 int 到 string 的几种方法(C++)
- C/C++中刷选int和float
- C语言基本数据类型int float double
- C语言当中int,float,double,char
- C语言强制类型转换 int ->float
- c语言基本数据类型short、int、long、char、float、double
- c语言基本数据类型short、int、long、char、float、double
- c++中关于数组作为函数参数并传递数组元素个数的几种有效方法的讨论
- 2013 多校第二场 hdu 4620 Fruit Ninja Extreme
- POJ 2286 - The Rotation Game IDA(迭代加深搜索,DFSID)
- 前端 CSS 规范大全
- Stanford机器学习---神经网络的学习 Neural Networks learning
- C++ 从float到int
- Android手势源码浅析------手势的形成(Gesture)
- 用Lucene索引数据库 .
- 初学两个月java程序开发的总结
- java 获得系统时间 转换成字符串
- C++11里面的Lambda表达式
- 9.0常见问题、教程汇总【20130319更新】
- maven项目配置时私服nexus以及仓库repository的一些情况
- 数据结构中单链表的实现+单链表的C语言实现源代码