看了标题,你是不是觉得这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之轮询、长轮询、websocket

    轮询 ajax轮询 ,ajax轮询 的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息. 1.后端代码 from flask import Flask,render_templat ...

  2. jvm启动

    首先使用 Java 命令启动JVM 其次进行JVM配置的装载——根据当前路径和系统的版本去寻找jvm.cfg文件,装载配置. 每种需要java虚拟机的软件,都会带一个jvm.cfg.然后jvm.cfg ...

  3. Spark的Java API例子详解

    package com.hand.study; import scala.Tuple2; import org.apache.spark.SparkConf; import org.apache.sp ...

  4. [golang note] 工程组织

    golang项目目录结构 <golang_proj> ├─README                 ├─AUTHORS                 ├─<bin>    ...

  5. centos7 lua安装

    yum -y install gcc automake autoconf libtool makeyum install readline-develcurl -R -O http://www.lua ...

  6. Python tricks(1) -- 动态定义一个新变量

    python是动态语言, 无需声明变量即可使用. 传递一个tuple, list或者dict等等方式, 有时候这种方式的使用不是很好. 对于tuple和list来说都是用下标的访问方式(即使用[]), ...

  7. springcloud18---springCloudConfig

    package com.itmuch.cloud; import org.springframework.beans.factory.annotation.Value; import org.spri ...

  8. 实现Vue-MVVM-step1

    一个利用defineProperty实现的MVVM双向数据绑 <!DOCTYPE html> <html lang="en"> <head> & ...

  9. SQL学习笔记八之ORM框架SQLAlchemy

    阅读目录 一 介绍 二 创建表 三 增删改查 四 其他查询相关 五 正查.反查 一 介绍 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进 ...

  10. jQuery:$(document).ready()用法

    jQuery:$(document).ready()用法 $(document).ready() 方法允许我们在文档完全加载完后执行函数;