我今天用微软拿的计算器计算了浮点十六进制代码,没想到。 然后,我查了又查,很难理解这个。
浮点的分配方式为32位、符号位(正负)、小数点位、小数点后的位数。
首先,计算机的内部数字按相反顺序存储在内存中。 也就是说1234,实际保管是4321。 我不知道怎么存储内存,只能在硬盘上看数据。 硬盘上的数据有大端序和小端序之分,但默认情况下,中文操作系统似乎是反向的小端序(little-endian )。
大印第安人
小端节序
将32位整数存储在硬盘上的顺序为每8位一个数字。 也就是说,每个数字都由十六进制表示,并像8位堆栈一样反向存储在硬盘上。 例如,整数3、347、750、752以十六进制表示,通常顺序是C7 8A 9F 60,存储在硬盘中时是60 9F 8A C7。
这个顺序很重要,我做音乐播放器几乎每天都在查PCM码,每天计算去。 我已经不熟悉逆序代码了。
但是研究浮点型,需要把十六进制转换成二进制。 因为浮点位有特定的用途。
在32比特浮点型数字中,第32比特是已编码比特,之后的8比特(即,23-31比特)是指数比特,而剩馀的23比特是尾数比特。
符号容易理解,即正负位。 至于什么是指数位,什么是尾数位,简单来说就是2^ (指数位-127 ) *尾数位。 以0.8、-0.8为例
首先,让我们看看这两个数的十六进制代码。
上图为正,下图为负。
同样是正负的。 反向输入计算器得到二进制值。
0.8的十六进制: 3F4C CCCD
0.8的二进制文件:0011 1111 0100 1100 1100 1100 1100 1101
正数符号位为0,负数符号位为零
请记住,这是逆序的。 也就是说,左起第一位是32位,即符号位。 这是最简单,最容易理解的。
下一个指数位的部分011 1111 0,指数位表示什么? 用十进制来说,指数位是指表示这个数字的位。 就像100千万,10^n次左右。 二进制也是一样的。 8位最多可以表示256个,即2^256次幂,但指数可以有负数,因此例如小于1的小数都是负数。 的0次方是1。 如果没有符号位,我们折中以127为边界,低于127表示负数,高于127表示正数。 也就是比1大的数。 虽然听起来很麻烦,但让我们来看看实例吧。
例如1.0000的二进制代码为0011 1111 1000 0000 0000 0000 0000 0000,红字部分是指数位。
也就是0111 1111,也就是127。 指数是0。 2^0=1。 1.00000,零数部分
例如,0.5000的二进制代码为0011 1111 0000 0000 0000 0000 0000 0000
0.5的指数位为0111 1110,即126,127-1,即-1。 2^(-1 )=0.5,尾数部为0。
0.25的二进制代码0011 1110 1000 0000 0000 0000 0000 0000
0.25的指数位为0111 1101,值为125,127-2。 2^(-2 )。
看看不能被二进制数整除的数字0.3333的二进制代码。0011 1110 1010 1010 1010 0110 0100 1100
0111 1101也是125,也就是-平方。 指数提供0.25的基础位数,相当于十进制的19、210、304的10、200、300,尾数部分用于表示9、10、04。 0.33的二进制指数位提供0.25个部分,即2^(-2 ),而剩下的0.0833由尾数提供
具体计算如下。
例如0.4的二进制文件为0011 1110 1100 1100 1100 1100 1100 1101(尾数)
http://www.Sina.com/http://www.Sina.com /
因为看了错误的教程,我走了很多弯路才弄清楚。 每次比较浮点数的二进制和十六进制代码时,都需要思考为什么是这样,浪费了很多时间。 我把这个写得这么细致是想不再浪费时间。