【转载】你真的会浮点数与整型数的"互转"吗?
看了标题,你是不是觉得这TM是哪个iOS彩笔写的入门文章.好的,那咱们先来看看几个例题,看看你有没有白白点进来!
int main() {
float a = -6.0;
int *b = &a;
NSLog(@"1=> %d",*b);
*b = -6;
NSLog(@"2=> %f",a);
return 0;
}
请问上面的1、2分别输出什么?(赶紧拿出草稿纸算一算吧!)
什么,这么简单的题目还要拿出草稿纸算,你TM是在侮辱我的智商吗?
输出结果不就是这个吗?
1=> -6
2=> -6.000000
还说不是彩笔写的文章,TM骗流量!
别急着返回,往下看!
首先为了防止你直接走了,那么我先抛出输出结果!看好了,千万别眨眼:
输出结果:
1=> -1061158912
2=> nan
对,没有看错,这就是输出结果.
我知道,有些人还不信,如果你确实不相信,而且你旁边有电脑,代码拷进Xcode跑一下,看看是这结果吗?(跑完之后再回来看,没错,相信我).
好的,跑完代码,你就很想往下看了吧,那就让我们一起来分析下,怎么会有这么魔性的结果,这不科学啊!!!!
首先,问题的关键在于不同类型的指针,指向相通的数据.
那么数据在计算机中是如何保存的呢?当然是二进制啊,就是一堆0和1.但是0和1只有计算机能懂啊,我们程序员哪里知道,一坨0和1表示什么呢!所以,计算机就要将保存在内存当中的0和1转换为我们能看得懂的数据,数字当然就被转换为了10进制的.这里有个关键点: 二进制数转换为十进制数.
这里抽离出了两个关键点 :
** 1. 整型数据 <==> 浮点型数据 **
**2. 进制 <==> 十进制 **
那么数据在内存中具体的保存方式是什么呢?
整型数据 4个字节 32位 每一位都是0或1,首位代表符号位.首位1代表负数;首位0,代表正数;
如: 5 =(转换为2进制)= 0 00..(中间略掉24个0)..00101
但是负数,保存的就是他的补码了.
补码 = 反码 + 1;
比如: -5 的 补码计算方式:
5 =(转为二进制)=> 0 00..(中间略掉24个0)..00101
=(求反码:0变为1,1变为0)=> 1 11..(中间略掉24个1)..11010
=(补码:反码 + 1)=> 1 11..(中间略掉24个1)..11011
好的,比较简单是吧!
那我们再看看浮点型数据的保存方式吧:
首先有一个公式,来将浮点型数据转化为我们好保存的结果,公式如下:
V = (-1)^S * M * 2^E;
- S: 符号位(Sign) : (-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数;
- E: 指数位(Exponent): M表示有效数字,大于等于1,小于2;
- M: 尾数部分(Mantissa): 2^E表示指数位.
指数E还可以再分成三种情况:
- E不全为0或不全为1.这时,浮点数就采用上面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1.
- E全为0.这时,浮点数的指数E等于1-127(或者1-1023),有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数.这样做是为了表示±0,以及接近于0的很小的数字.
- E全为1.这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);如果有效数字M不全为0,表示这个数不是一个数(NaN).
比如:
6.0 =(二进制)=> 110.0 =(按上式转换)=> (-1)^0 * 1.1 * 2^2 => S = 0;M = 1.1; E = 2;
那么有了公式,又有什么用呢?这个公式其实完全告诉我们浮点数据的保存方式了.
具体是这样的,在32位的二进制数据中,第1位保存S,接下来8未保存E,剩下的保存M.
注意,为了能让E表示负数,在保存的时候,会将它 +127,在取的时候,又捡回去,这样就能表示负数了;由于M都是1.,所以就不保存前面的1了,在取的时候再拿回去.*
说这么多,还是煮个
【转载】你真的会浮点数与整型数的"互转"吗?的更多相关文章
- 使用头文件climits中的符号常量获知整型数据的表数范围---gyy整理
在头文件climits(limits.h)以宏定义的方式定义了各种符号常量来表示各种整型类型表示数的范围,如int的最大最小值,long的最大最小值等. 符号常量 表示 CHAR_BIT char 的 ...
- 使用程序获取整型数据和浮点型数据在内存中的表示---gyy整理
使用程序获取整型数据和浮点型数据在内存中的表示. C++中整型(int).短整型(short int).单精度浮点数(float).双精度浮点数(double)在内存中所占字节数不同,因此取值范围也不 ...
- C# 整型数和浮点型数的进制转换
1.十进制转二进制 /// <summary> /// 十进制转二进制 /// </summary> public class Convert10To2 { /// <s ...
- 实验12:Problem H: 整型数组运算符重载
Home Web Board ProblemSet Standing Status Statistics Problem H: 整型数组运算符重载 Problem H: 整型数组运算符重载 Tim ...
- PHP中IP地址与整型数字互相转换详解
这篇文章主要介绍了PHP中IP地址与整型数字互相转换详解,本文介绍了使用PHP函数ip2long与long2ip的使用,以及它们的BUG介绍,最后给出自己写的两个算法,需要的朋友可以参考下 IP转换成 ...
- c# 计算一个整型数组的平均
一个整型数组的平均: class Program { static void Main(string[] args) { ,,,,,,,,,}; double avg= GetAvg(array); ...
- Java 判断是否为汉字 判断是否为乱码 判断字符串是否为双整型数字 整数 数字
/** * 判断是否为汉字 * * @param str * @return */ public static boolean isGBK(String str) { char[] ch ...
- Java整型数组的最大长度到底有多长?
Java整型数组的最大长度到底有多长? 今天上网查了一下,各种说法都有,这个问题似乎总困扰我们Java初学者,无奈,只好自己试了一下,以下是我的测试代码,如果有错误,还望不吝赐教! 使用eclipse ...
- MySQL中整型数据的差别
bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字).存储大小为 8 个字节. P.S. b ...
随机推荐
- JQuery表格操作的常用技巧总结
JQuery对表格进行操作的常用技巧. 1.表格奇数行和偶数行分别添加样式 复制代码代码如下: $(function(){ $('tr:odd').addClass("odd") ...
- SpringData_JpaRepository接口
该接口提供了JPA的相关功能 List<T> findAll(); //查找所有实体 List<T> findAll(Sort sort); //排序.查找所有实体 List& ...
- MySQL中特有的函数If函数
上面我们已经知道了case函数可以实现逻辑判断,可以是很复杂的逻辑判断,但是如果我们只想实现的是如果这个条件成立就返回A否则就返回B这样简单的逻辑如果用case的话,未免复杂了.我们可以使用if函数来 ...
- 1:3访问 servlet API 的两种方式(request,session等内置对象)
1:解耦方式 2:耦合方式: ========================================== ========================================== ...
- Java 对比Vector、ArrayList、LinkedList
①引言 在日常生活中能高效的管理和操作数据是非常重要的.Java提供了强大的集合框架,大大提高了开发者的生产力,今天就了解一下有关集合框架方面的问题. Vector.ArrayList.LinkedL ...
- SpringCloud配置
encrypt说明 名称 默 认 描述 encrypt.fail-on-error true 标记说,如果存在加密或解密错误,进程将失败. encrypt.key 对称密钥.作为一个更强大的替代方 ...
- C#——JSON操作类简单封装(DataContractJsonSerializer)
Framework版本:.Net Framework 4 使用DataContractJsonSerializer时,实体请使用注解,格式如下 1.实体使用注解,并且提供get和set的public访 ...
- Ubuntu下常用强化学习实验环境搭建(MuJoCo, OpenAI Gym, rllab, DeepMind Lab, TORCS, PySC2)
http://lib.csdn.net/article/aimachinelearning/68113 原文地址:http://blog.csdn.net/jinzhuojun/article/det ...
- CV 两幅图像配准
http://www.cnblogs.com/Lemon-Li/p/3504717.html 图像配准算法一般可分为: 一.基于图像灰度统计特性配准算法:二.基于图像特征配准算法:三.基于图像理解的配 ...
- bzoj2733 / P3224 [HNOI2012]永无乡(并查集+线段树合并)
[HNOI2012]永无乡 每个联通块的点集用动态开点线段树维护 并查集维护图 合并时把线段树也合并就好了. #include<iostream> #include<cstdio&g ...