看了标题,你是不是觉得这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;

  1. S: 符号位(Sign) : (-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数;
  2. E: 指数位(Exponent): M表示有效数字,大于等于1,小于2;
  3. M: 尾数部分(Mantissa): 2^E表示指数位.

指数E还可以再分成三种情况:

  1. E不全为0或不全为1.这时,浮点数就采用上面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1.
  2. E全为0.这时,浮点数的指数E等于1-127(或者1-1023),有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数.这样做是为了表示±0,以及接近于0的很小的数字.
  3. 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了,在取的时候再拿回去.*

说这么多,还是煮个

【转载】你真的会浮点数与整型数的"互转"吗?的更多相关文章

  1. 使用头文件climits中的符号常量获知整型数据的表数范围---gyy整理

    在头文件climits(limits.h)以宏定义的方式定义了各种符号常量来表示各种整型类型表示数的范围,如int的最大最小值,long的最大最小值等. 符号常量 表示 CHAR_BIT char 的 ...

  2. 使用程序获取整型数据和浮点型数据在内存中的表示---gyy整理

    使用程序获取整型数据和浮点型数据在内存中的表示. C++中整型(int).短整型(short int).单精度浮点数(float).双精度浮点数(double)在内存中所占字节数不同,因此取值范围也不 ...

  3. C# 整型数和浮点型数的进制转换

    1.十进制转二进制 /// <summary> /// 十进制转二进制 /// </summary> public class Convert10To2 { /// <s ...

  4. 实验12:Problem H: 整型数组运算符重载

    Home Web Board ProblemSet Standing Status Statistics   Problem H: 整型数组运算符重载 Problem H: 整型数组运算符重载 Tim ...

  5. PHP中IP地址与整型数字互相转换详解

    这篇文章主要介绍了PHP中IP地址与整型数字互相转换详解,本文介绍了使用PHP函数ip2long与long2ip的使用,以及它们的BUG介绍,最后给出自己写的两个算法,需要的朋友可以参考下 IP转换成 ...

  6. c# 计算一个整型数组的平均

    一个整型数组的平均: class Program { static void Main(string[] args) { ,,,,,,,,,}; double avg= GetAvg(array); ...

  7. Java 判断是否为汉字 判断是否为乱码 判断字符串是否为双整型数字 整数 数字

    /**  * 判断是否为汉字  *   * @param str  * @return  */ public static boolean isGBK(String str) {  char[] ch ...

  8. Java整型数组的最大长度到底有多长?

    Java整型数组的最大长度到底有多长? 今天上网查了一下,各种说法都有,这个问题似乎总困扰我们Java初学者,无奈,只好自己试了一下,以下是我的测试代码,如果有错误,还望不吝赐教! 使用eclipse ...

  9. MySQL中整型数据的差别

    bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字).存储大小为 8 个字节. P.S. b ...

随机推荐

  1. python技巧总结之set、日志、rsa加密

    一.日志模块logging模块调用 1.日志模块使用原理 #!/usr/bin/python # -*- coding:utf-8 -*- import logging # 方式一: "&q ...

  2. Django—Form两种保留用户提交数据的方法

    用户在网页上进行表单填写时,有可能出现某项填写错误.一般情况下,用户在未发觉错误的情况下点击提交,则此表单的内容会清空,用户不得不再重新填写,这样的用户体验是及其糟糕的. 在此,我们有2种方法将用户的 ...

  3. 29张截图-全新安装CentOS7.5-超详细!

    目录 全新安装CentOS7.5 配置虚拟机 调整网卡名称 配置时区,分区,关闭安全工具 配置网络参数 配置root账户密码 参考链接 全新安装CentOS7.5 可以到这里下载镜像https://m ...

  4. 上传文件小的oK,大一点的传不了,显示 (failed) net::ERR_CONNECTION_RESET

    我很确定已经修改了php.ini中的文件上传限制,文件权限可写. 修改php.ini file_uploads = on ;是否允许通过HTTP上传文件的开关.默认为ON即是开 upload_tmp_ ...

  5. 4.11 Routing -- Loading/Error Substates

    除了在上节中描述的技术,Ember路由器通过使用error和loading substates为自定义异步跳转提供强大而可重写的约定. 一.loading Substates 1. 在跳转过程中,Em ...

  6. 17初识select

    多路复用 select 同时监控多个文件描述符的输入输出 <sys/types.h> <sys/times.h> <sys/select.h> int select ...

  7. Educational Codeforces Round 55 (Rated for Div. 2) Solution

    A. Vasya and Book Solved. 三种方式取$Min$ #include <bits/stdc++.h> using namespace std; #define ll ...

  8. 吴恩达深度学习笔记(deeplearning.ai)之循环神经网络(RNN)(三)

    1. 导读 本节内容介绍普通RNN的弊端,从而引入各种变体RNN,主要讲述GRU与LSTM的工作原理. 事先声明,本人采用ng在课堂上所使用的符号系统,与某些学术文献上的命名有所不同,不过核心思想都是 ...

  9. mssql查询所有上下级

    if exists (select * from sys.all_objects where name='GetOrgTreeByID') begin drop proc GetOrgTreeByID ...

  10. Vue学习笔记之vue-cli脚手架安装和webpack-simple模板项目生成

    vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目. GitHub地址是:https://github.com/vuejs/vue-cli 一. ...