【每日一发】同样4个字节的浮点数和整数为什么表达的范围有很大差异
2015-04-18 11:52
302 查看
如果突然问这个问题,不知道是不是每个人都能思路清晰的应答。下面简单的说一说这个区别
32位的整数,最大值是21亿左右,占用4个字节的浮点数,最大值大约是3.4×10^38.
虽然两者占用的空间一致,但是其组织数据的方式是完全不同的。
先说说比较属性的整形吧,为了简单,只说正数,符号位1位,值为0,后面的全部是111, 0111 1111 1111 1111 1111 1111,16进制的表示为 7F FF FF FF.
浮点数的表示方法为: 符号位 + 阶码 + 尾数,为了简化,这里也只是考虑正数。4字节的浮点数,符号位1,解码有8位,而尾数就有23位。 其中阶码在实际中用移码表示,尾数就是浮点数内部可以存储表达的真实数据部分。
先看一个简单的例子。
30.5如何表示:
正数:符号位为0
30用二进制表示就是 11110
0.5用二进制表示是: 0.1
小数转换为二进制,就是用二成 5 × 2 = 10,那么这里就是0.1了
那么综合起来就是 11110.1,那么这样看起来,该数亦可以向左移动4次(阶码),即 真实的尾数就是1.11101,众所周知,二进制就0,和1,而从尾数的特点可以看出,最原始的尾数一定是 1.xxxx,即第一位恒为1,这样,这个1就可以省略,那么这里的尾数就是 11101。
阶码4位,用移码表示就是 127 + 4 = 131 ,即 1000 0011,至此数据准备好了:
符号位: 0
阶码(经过移码处理的结果): 1000 00111
尾数(总共23位,未满用0补齐) 1110 1[000] [0000] [0000] [0000] [000]
所以最后的结果就是 0 1000 00111 1110 1[000] [0000] [0000] [0000] [000]
那么反推回去:
1) 第一位是符号位,0,代表正数
2) 再取8位作为阶码信息, 1000 0011,结果为0x83,即131,131比127大4,真实的阶码就是4
3)尾数部分就是后面23位,那么就是 11101,由于前面有一个1,最终的情况就是 1.11101,由于阶码是4,向左移动4位,即11110.1,整数部分就是 ox1E,即30,小数部分这里 1 × 2 ^ -1 ,就0.5.
那么最大的浮点数是什么样的呢:
从最终的二进制表示来看,就是
0 【1111 1111】 【1111 1111 1111 1111 111】,现在反推
真实的尾数是 1.【1111 1111 1111 1111 111】
阶码本身有正有负,而8位的有符号数的范围是-128 - 127.因此最大的单精度浮点数为:
1.11111111111111111111111 正向阶码为127,结果为 340282346638528860000000000000000000000.000000
32位的整数,最大值是21亿左右,占用4个字节的浮点数,最大值大约是3.4×10^38.
虽然两者占用的空间一致,但是其组织数据的方式是完全不同的。
先说说比较属性的整形吧,为了简单,只说正数,符号位1位,值为0,后面的全部是111, 0111 1111 1111 1111 1111 1111,16进制的表示为 7F FF FF FF.
浮点数的表示方法为: 符号位 + 阶码 + 尾数,为了简化,这里也只是考虑正数。4字节的浮点数,符号位1,解码有8位,而尾数就有23位。 其中阶码在实际中用移码表示,尾数就是浮点数内部可以存储表达的真实数据部分。
先看一个简单的例子。
30.5如何表示:
正数:符号位为0
30用二进制表示就是 11110
0.5用二进制表示是: 0.1
小数转换为二进制,就是用二成 5 × 2 = 10,那么这里就是0.1了
那么综合起来就是 11110.1,那么这样看起来,该数亦可以向左移动4次(阶码),即 真实的尾数就是1.11101,众所周知,二进制就0,和1,而从尾数的特点可以看出,最原始的尾数一定是 1.xxxx,即第一位恒为1,这样,这个1就可以省略,那么这里的尾数就是 11101。
阶码4位,用移码表示就是 127 + 4 = 131 ,即 1000 0011,至此数据准备好了:
符号位: 0
阶码(经过移码处理的结果): 1000 00111
尾数(总共23位,未满用0补齐) 1110 1[000] [0000] [0000] [0000] [000]
所以最后的结果就是 0 1000 00111 1110 1[000] [0000] [0000] [0000] [000]
那么反推回去:
1) 第一位是符号位,0,代表正数
2) 再取8位作为阶码信息, 1000 0011,结果为0x83,即131,131比127大4,真实的阶码就是4
3)尾数部分就是后面23位,那么就是 11101,由于前面有一个1,最终的情况就是 1.11101,由于阶码是4,向左移动4位,即11110.1,整数部分就是 ox1E,即30,小数部分这里 1 × 2 ^ -1 ,就0.5.
那么最大的浮点数是什么样的呢:
从最终的二进制表示来看,就是
0 【1111 1111】 【1111 1111 1111 1111 111】,现在反推
真实的尾数是 1.【1111 1111 1111 1111 111】
阶码本身有正有负,而8位的有符号数的范围是-128 - 127.因此最大的单精度浮点数为:
1.11111111111111111111111 正向阶码为127,结果为 340282346638528860000000000000000000000.000000
相关文章推荐
- 关于为什么电脑32位系统在处理数据时是4个字节的二进制数据以及byte取值范围的考虑?
- 黑马程序员:JAVA整数数据类型取值范围及为什么是这个范围?
- 自守数 寻找出2千万以内的所有自守数。注意,2千万的平方已经超出了整数表达的最大范围,所以该程序使用了一个巧妙的方案。
- 为什么二进制文件与文本文件存入同样的数据,文件大小差异会这么大?(from <<Thinking in C++>>'s execise)
- 关于int范围中负数最小值的绝对值比整数最大值大初学C,问题源自:为什么C中的int类型(16位)的下溢下限为-32768而上溢上限却是32767。 首先说吧,32767很容易理解,32767=
- 浮点数能够精确表示的整数的范围
- 浮点数与4个字节的转换
- 数据类型:整数最小值为何不是最大值的相反数(为什么八位二进制数表示范围是:-128~127 ) ?
- 数据结构:有人设计以下算法用于删除整数顺序表L中所有值在[x,y]范围内的元素,该算法显然不是高效的,请设计一个同样功能的高效算法。
- 【Java】如何检测、替换4个字节的utf-8编码(此范围编码包含emoji表情)
- (P)为什么重nor中读取4个字节时要访问nor两次?
- 32位机指针为什么是4个字节 64位与32位机的区别
- 为什么整数范围是0 - 2^32 - 1,一共有4G种取值
- 显示整数、浮点数的二进制字节排列函数
- 有N个Int32范围内的正整数,找出N个数两两之间最大公约数的最大值。例如:N = 4,4个数为:9 15 25 16,两两之间最大公约数的最大值是15同25的最大公约数5。
- float 为什么可以表示很大的整数
- 为什么1个字节的取值范围是-128~127
- 【转】关于int范围中负数最小值的绝对值比整数最大值大初学C,问题源自:为什么C中的int类型(16位)的下溢下限为-32768而上溢上限却是32767。 首先说吧,32767很容易理解,32767=
- python 中4个字节怎么变成一个浮点数
- 类的数组 new出来的内存为什么多4个字节