您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
负数的补码(深入理解计算机中数的表示:原码、补码、阶码、移码)
表示,补码,尾数负数的补码(深入理解计算机中数的表示:原码、补码、阶码、移码)
发布时间:2019-02-08加入收藏来源:互联网点击:
2.3 IEEE 754标准浮点数格式
IEEE 754标准中定义了两种基本的浮点数格式:32位的单精度格式和64位的双精度格式:
32位单精度格式中包含1位符号、8位阶码和23位尾数;64位双精度格式中包含1位符号、11位阶码和52位尾数。两种格式下基数均隐含为2。
IEEE 754标准中,尾数用原码表示。由于表示同一个数的时候尾数可以有多种表示,例如可以表示为,也可以表示成,因此需要一个规格化的表示来使得表示唯一。IEEE 754标准中规格化尾数的表示统一为1.xxxx的形式。尾数规格化后第一位总为1,因而可以在尾数中缺省这一位1。隐藏该位后尾数可以多一位表示,精度提高一位。
IEEE 754标准中,阶码是用加偏置常量的移码表示,但是所用的偏置常量并不是通常n位移码所用的,而是,因此,单精度和双精度浮点数的偏置常量分别为127和1023。
我们可以用代码来模拟一下double的64位双精度格式:
#include <stdio.h>void floatNumber_1(){ struct FF{ // 小端模式模拟double类型编码 unsigned l:32; // 剩下的小数位 unsigned m:15; // 剩下的小数位 unsigned k:5; // 取5位小数 unsigned j:11; // 阶码 unsigned i:1; // 符号位 }; union UN { double dd; FF ff; }; UN un; un.dd = -15.75; // -1111.11 printf("%dn",un.ff.i); // 1 printf("%dn",un.ff.j); // 1023 3 printf("%dn",un.ff.k); // 31 也就是二进制的11111}void floatNumber_2(){ struct FF{ // 小端模式模拟double类型编码 unsigned l:32; // 剩下的小数位 unsigned m:15; // 剩下的小数位 unsigned k:5; // 取5位小数 unsigned j:11; // 阶码 unsigned i:1; // 符号位 }; union UN { double dd; FF ff; }; UN un; un.ff.i = 1; un.ff.j = 1023 3; un.ff.k = 31; // 二进制的11111 un.ff.m = 0; un.ff.l = 0; printf("%.2lfn",un.dd); //un.dd = -15.75;// -1111.11}int main(){ floatNumber_1(); floatNumber_2(); while(1); return 0;}/*1102631-15.75*/
IEEE 754标准对浮点数的一些情况做了特殊的规定,总的来说可以分为5种情况,主要用阶码进行区分,下表给出了IEEE 754标准中单精度和双精度不同浮点数的表示。
(1)无穷大:阶码全1尾数全0
引入无穷大是为了在出现浮点计算异常时保证程序能够继续执行下去,同时也为程序提供一种检测错误的途径。 ∞在数值上大于所有有限浮点数,−∞在数值上小于所有有限浮点数。无穷大不仅可以是运算的结果,也可以作为运算的源操作数。当无穷大作为源操作数时,根据IEEE 754标准规定,可以得到无穷大或非数的结果。
(2)非数(NaN):阶码全1尾数非0
非数(NaN)表示一个没有定义的数。引入非数的目的是检测非初始化值的使用,而且在计算出现异常时程序能够继续执行下去。非数根据尾数的内容又可以分为发信号非数(Signaling NaN)和不发信号非数(Quiet NaN)两种。如果源操作数是Quiet NaN,则运算结果还是Quiet NaN;如果源操作数是Signaling NaN,则会触发浮点异常。
(3)规格化非0数:阶码非全0非全1
阶码e的值落在[1, 254](单精度)和[1, 2046](双精度)范围内且尾数f是非0值的浮点数是规格化的非0数。其尾数经过规格化处理,最高位的1被省略,因此如果符号位是0,则表示数值为(单精度)和(双精度);如果符号位是1,则表示数值为(单精度)和(双精度)。
(4)非规格化非0数:阶码全0尾数非0
在规格化非0数中,能表示的浮点数的最小阶值是-126(单精度)和-1022(双精度),如果浮点数的绝对值小于(单精度)和(双精度),该如何表示呢?IEEE 754允许特别小的非规格化数,此时阶码为0,尾数的小数点前面的那个1就不再添加了。因此如果符号位是0,则表示数值为(单精度)和(双精度);如果符号位是1,则表示数值为(单精度)和(双精度)。非规格化数填补了最小的规格化数和0之间的一段空隙,使得浮点数值可表示的精度进一步提升了很多。
(5)零:阶码全0尾数全0
根据符号位的取值,分为 0和-0。
ref:
https://foxsen.github.io/archbase/运算器设计.html
-End-
本文到此结束,希望对大家有所帮助呢。
上一篇:天净沙秋思的意思(欣赏篇:马致远《天净沙.秋思》短短几个字,都道尽了无尽的悲凉)
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |