在我的机器上用联合体得到浮点数的四个字节如下(用16进制表示):
1.0 0,0,80,3f
2.0 0,0,0,40
3.0 0,0,40,40
4.0 0,0,80,40
5.0 0,0,a0,40
8.0 0,0,0,41
10.0 0,0,20,41
16.0 0,0,80,41
32.0 0,0,0,42
64.0 0,0,80,42
请哪位大哥能告诉我其中的阶码是那几位,尾数那个是高位,哪个是低位?多谢!
1.0 0,0,80,3f
2.0 0,0,0,40
3.0 0,0,40,40
4.0 0,0,80,40
5.0 0,0,a0,40
8.0 0,0,0,41
10.0 0,0,20,41
16.0 0,0,80,41
32.0 0,0,0,42
64.0 0,0,80,42
请哪位大哥能告诉我其中的阶码是那几位,尾数那个是高位,哪个是低位?多谢!
二进制的定点、浮点数据表示 主要讲述是的IEEE标准的二进制浮点数表示: IEEE754标准在表示浮点数时,每个浮点数均由三部分组成:符号位S,指数部分E和尾数部分M。我们知道10进制数的科学计数法如A= -3.5×105这里最前面有一个负号,3.5是尾数,两个有效数字,后面以10为基数的指数为5。我们可以将它表示为-3.5E5同样,二进制数也可以用科学计数法规格化表示,比如5这个数,如果用二进制表示的话,整型为101,如果用科学计数法则可以表示为 1.25×24 ,这里用的是十进制,将尾数换成二进制就是1.01(就是101向前移两位小数点,和十进制完全相同),后面的指数4换成二进制则是10, 那我们将其用二进制的科学计数法就可以写成1.01E10。当我们依照这种计数法给一个数字确定其精度(有效位)后,就可以用一定长度的1和0的位串来表示一个实数了。 浮点数一般采用以下四种基本格式: (1)单精度格式(32位):除去符号位1位后,E占8位,M占23位。 (2)扩展单精度格式:E>=11位,M31位。 (3)双精度格式:(64位);E=11位,M=52位。 (4)扩展双精度格式:E>=15位,M>63位。 我们最重要的是掌握单精度格式的表示法。在IEEE754标准中,约定小数点左边隐含有一位,通常这位数就是1,这样实际上使尾数的有效位数为24位,即尾数为1.M。指数的值在这里称为阶码,为了表示指数的正负,所以阶码部分采用移码表示,移码值为127,阶码值即从1到254变为-126至+127,在IEEE754中所有的数字位都得到了使用,明确地表示了无穷大和0,并且还引进了"非规格化数",使得绝对值较小的数得到更准确表示。请看下表:S(1位) E(8位) M(23位) N(共32位)
符号位 0 0 0
符号位 0 不等于0 (-1)S·2-126·(0.M) 为非规格化数
符号位 1到254之间 不等于0 (-1)S·2E-127·(1.M) 为规格化数
符号位 255 不等于0 NaN(非数值)
符号位 255 0 无穷大 其中红色字0、1表示隐含位,注意当数字N为非规格化数或是0时,隐含位是0。 记住了上面的表格就能算出所有IEEE标准的单精度二进制浮点数了,我们重点要会计算规格化数字的双向转换,并且理解二进制浮点数表示法的思想。具体的数在内存中存放的字节顺序也是有区别的。有所谓的大端编码和小端编码规则。在intel系列的CPU中,是采用小端编码规则。也就是说:最低位字节放在最前面,最高位字节放在最后面。大端编码刚好相反(如PowerPC)。
例子:
int a = 2;
小端编码在内存中变量a的表示是: 0x02,0x00,0x00,0x00
大端编码在内存中变量a的表示是: 0x00,0x00,0x00,0x02