信息的表示和处理

信息存储

  • 字长与字节

  • 字长:每个计算机都有一个字长,对于字长为w位的机器而言,虚拟地址范围为0~<nobr><span class="math" id="MathJax-Span-2056" style="width: 3.576em; display: inline-block;"><span style="display: inline-block; position: relative; width: 2.829em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(1.869em 1000em 2.883em -0.424em); top: -2.717em; left: 0.003em;"><span class="mrow" id="MathJax-Span-2057"><span class="msubsup" id="MathJax-Span-2058"><span style="display: inline-block; position: relative; width: 1.123em; height: 0px;"><span style="position: absolute; clip: rect(1.923em 1000em 2.883em -0.424em); top: -2.717em; left: 0.003em;"><span class="mn" id="MathJax-Span-2059" style="font-family: MathJax_Main;">2</span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span><span style="position: absolute; top: -2.824em; left: 0.536em;"><span class="mi" id="MathJax-Span-2060" style="font-size: 70.7%; font-family: MathJax_Math-italic;">w</span><span style="display: inline-block; width: 0px; height: 2.456em;"></span></span></span></span><span class="mo" id="MathJax-Span-2061" style="font-family: MathJax_Main; padding-left: 0.216em;">−</span><span class="mn" id="MathJax-Span-2062" style="font-family: MathJax_Main; padding-left: 0.216em;">1</span></span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span></span><span style="border-left-width: 0.003em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.003em; vertical-align: -0.063em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-292">2^w-1</script>,32位的计算机虚拟地址空间被限定为4GB,当然操作系统有办法解决这一问题。

  • 字节:1byte=8bit。

  • 寻址与字节顺序。对于跨越多字节的程序对象,我们必须建立两个规则:这个对象的地址是什么,以及在存储器中如何排列这些字节。

    • 对象的地址:在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节中最小的地址。如,int类型的变量x的地址为0x100,也就是说,地址表达式&x的值为0x100。那么,x的4个字节将被存储在存储器的0x100、0x101、0x102和0x103位置。
    • 字节的排列:排列表示一个对象的字节有两个通用的规则——大端法和小端法。假设变量x类型为int,位于地址0x100处,它的十六进制值为0x01234567。地址范围为0x100~0x103的字节,不同的方法排列顺序如下:
      信息的表示和处理
  • 布尔代数简介
    信息的表示和处理

  • 位级运算。位级运算就是按位进行布尔运算。这些运算能运用到任何“整型”的数据类型上,以下是一些对char数据类型表达式求值的例子:
    信息的表示和处理

    • 掩码运算:位级运算的一个常见用法就是实现掩码运算。掩码是一串二进制代码对目标字段进行位与运算,屏蔽当前的输入位。
      例如:掩码0xFF,x=0x89ABCDEF,x&0xFF将得到0x000000EF。
      表达式~0将生成一个全1的掩码,不管机器的字大小是多少。
  • 移位运算:
  • 逻辑右移:逻辑右移在左端补k个0。
  • 算数右移:算术右移在左端补k个最高有效位的值。

    例子:
    信息的表示和处理

    对于无符号数据,右移必须是逻辑的。
    Java对于如何进行右移有明确的定义。表达式x>>k会将x算术右移k个位置,而x>>>k会对x做逻辑右移。

整数

  • 有符号数的表示

    • 原码表示:最高有效位是符号位,其余表示数值。如:
      3 = [00000011]
      -3 = [10000011]
    • 反码表示:最高有效位为负权,权重为<nobr><span class="math" id="MathJax-Span-9024" style="width: 6.669em; display: inline-block;"><span style="display: inline-block; position: relative; width: 5.336em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(1.709em 1000em 3.149em -0.371em); top: -2.717em; left: 0.003em;"><span class="mrow" id="MathJax-Span-9025"><span class="mo" id="MathJax-Span-9026" style="font-family: MathJax_Main;">−</span><span class="mo" id="MathJax-Span-9027" style="font-family: MathJax_Main;">(</span><span class="msubsup" id="MathJax-Span-9028"><span style="display: inline-block; position: relative; width: 2.029em; height: 0px;"><span style="position: absolute; clip: rect(1.923em 1000em 2.883em -0.424em); top: -2.717em; left: 0.003em;"><span class="mn" id="MathJax-Span-9029" style="font-family: MathJax_Main;">2</span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span><span style="position: absolute; top: -2.877em; left: 0.536em;"><span class="texatom" id="MathJax-Span-9030"><span class="mrow" id="MathJax-Span-9031"><span class="mi" id="MathJax-Span-9032" style="font-size: 70.7%; font-family: MathJax_Math-italic;">w</span><span class="mo" id="MathJax-Span-9033" style="font-size: 70.7%; font-family: MathJax_Main;">−</span><span class="mn" id="MathJax-Span-9034" style="font-size: 70.7%; font-family: MathJax_Main;">1</span></span></span><span style="display: inline-block; width: 0px; height: 2.509em;"></span></span></span></span><span class="mo" id="MathJax-Span-9035" style="font-family: MathJax_Main; padding-left: 0.216em;">−</span><span class="mn" id="MathJax-Span-9036" style="font-family: MathJax_Main; padding-left: 0.216em;">1</span><span class="mo" id="MathJax-Span-9037" style="font-family: MathJax_Main;">)</span></span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span></span><span style="border-left-width: 0.003em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.537em; vertical-align: -0.397em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-879">-(2^{w-1}-1)</script>,其余同补码。如:
      3 = [00000011]
      -3 = [11111100]
      表现形式为按位取反,因为最高位相当于掩码。
    • 补码表示:最高有效位为负权,权重为<nobr><span class="math" id="MathJax-Span-9038" style="width: 3.576em; display: inline-block;"><span style="display: inline-block; position: relative; width: 2.829em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(1.709em 1000em 2.883em -0.371em); top: -2.717em; left: 0.003em;"><span class="mrow" id="MathJax-Span-9039"><span class="mo" id="MathJax-Span-9040" style="font-family: MathJax_Main;">−</span><span class="msubsup" id="MathJax-Span-9041"><span style="display: inline-block; position: relative; width: 2.029em; height: 0px;"><span style="position: absolute; clip: rect(1.923em 1000em 2.883em -0.424em); top: -2.717em; left: 0.003em;"><span class="mn" id="MathJax-Span-9042" style="font-family: MathJax_Main;">2</span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span><span style="position: absolute; top: -2.877em; left: 0.536em;"><span class="texatom" id="MathJax-Span-9043"><span class="mrow" id="MathJax-Span-9044"><span class="mi" id="MathJax-Span-9045" style="font-size: 70.7%; font-family: MathJax_Math-italic;">w</span><span class="mo" id="MathJax-Span-9046" style="font-size: 70.7%; font-family: MathJax_Main;">−</span><span class="mn" id="MathJax-Span-9047" style="font-size: 70.7%; font-family: MathJax_Main;">1</span></span></span><span style="display: inline-block; width: 0px; height: 2.509em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span></span><span style="border-left-width: 0.003em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.203em; vertical-align: -0.063em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-880">-2^{w-1}</script>,符号位设置为1时,表示负数,设置为0时,值为非负。如:
      3 = [00000011]
      -3 = [11111101]
      负数的补码是将其正数各位取反之后再加1。补码的范围是不对称的,TMin没有与之对应的正数。
      补码是计算机中最常见的有符号数表示方式。Java只支持有符号数,且使用补码运算。
  • 扩展数字

    • 零扩展:在开头补0。
    • 符号扩展:在开头添加最高有效位的副本。
  • 截断数字:直接丢弃高位。如:

    int x = 52191;          //1100111111000111
    short sx = (short)x;    //1100111111000111-->-12345
    int y = sx;             //-12345
  • 整数的运算:补码执行与无符号算术相同的位级实现。对于计算机来说可以按相同方式计算。

浮点数

  • 二进制的小数
    首先,我们看下小数的二进制表示。
    信息的表示和处理

    信息的表示和处理

  • 浮点数的表示
    IEEE浮点标准用<nobr><span class="math" id="MathJax-Span-46302" style="width: 11.576em; display: inline-block;"><span style="display: inline-block; position: relative; width: 9.229em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(1.709em 1000em 3.149em -0.424em); top: -2.717em; left: 0.003em;"><span class="mrow" id="MathJax-Span-46303"><span class="mi" id="MathJax-Span-46304" style="font-family: MathJax_Math-italic;">V<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.163em;"></span></span><span class="mo" id="MathJax-Span-46305" style="font-family: MathJax_Main; padding-left: 0.269em;">=</span><span class="mo" id="MathJax-Span-46306" style="font-family: MathJax_Main; padding-left: 0.269em;">(</span><span class="mo" id="MathJax-Span-46307" style="font-family: MathJax_Main;">−</span><span class="mn" id="MathJax-Span-46308" style="font-family: MathJax_Main;">1</span><span class="msubsup" id="MathJax-Span-46309"><span style="display: inline-block; position: relative; width: 0.856em; height: 0px;"><span style="position: absolute; clip: rect(1.816em 1000em 3.149em -0.424em); top: -2.717em; left: 0.003em;"><span class="mo" id="MathJax-Span-46310" style="font-family: MathJax_Main;">)</span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span><span style="position: absolute; top: -2.931em; left: 0.429em;"><span class="mi" id="MathJax-Span-46311" style="font-size: 70.7%; font-family: MathJax_Math-italic;">s</span><span style="display: inline-block; width: 0px; height: 2.456em;"></span></span></span></span><span class="mo" id="MathJax-Span-46312" style="font-family: MathJax_Main; padding-left: 0.216em;">×</span><span class="msubsup" id="MathJax-Span-46313" style="padding-left: 0.216em;"><span style="display: inline-block; position: relative; width: 1.123em; height: 0px;"><span style="position: absolute; clip: rect(1.923em 1000em 2.883em -0.424em); top: -2.717em; left: 0.003em;"><span class="mn" id="MathJax-Span-46314" style="font-family: MathJax_Main;">2</span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span><span style="position: absolute; top: -2.824em; left: 0.536em;"><span class="mi" id="MathJax-Span-46315" style="font-size: 70.7%; font-family: MathJax_Math-italic;">E<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span><span style="display: inline-block; width: 0px; height: 2.456em;"></span></span></span></span><span class="mo" id="MathJax-Span-46316" style="font-family: MathJax_Main; padding-left: 0.216em;">×</span><span class="mi" id="MathJax-Span-46317" style="font-family: MathJax_Math-italic; padding-left: 0.216em;">M<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.109em;"></span></span></span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span></span><span style="border-left-width: 0.003em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.537em; vertical-align: -0.397em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-4278">V = (-1) ^s × 2^E× M</script>的形式来表示一个数:

    • 符号(sign):s决定这个数是负数(s=1)还是正数(s=0)。
    • 阶码(exponent):E的作用是对浮点数加权,这个权重是2的E次幂(可能是负数)。
    • 尾数(significand):M是一个二进制小数。

    信息的表示和处理
    在单精度浮点格式(float)中,s、exp和frac字段分别为1位、k = 8位和n = 23位,得到一个32位的表示。
    在双精度浮点格式(double)中,s、exp和frac字段分别为1位、k = 11位和n = 52位,得到一个64位的表示。

    根据exp的值,被编码的值可以分成三种不同的情况:
    信息的表示和处理

    • 规格化的值:
      阶码的位表示为<nobr><span class="math" id="MathJax-Span-46318" style="width: 6.509em; display: inline-block;"><span style="display: inline-block; position: relative; width: 5.176em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(2.136em 1000em 3.043em -0.424em); top: -2.717em; left: 0.003em;"><span class="mrow" id="MathJax-Span-46319"><span class="msubsup" id="MathJax-Span-46320"><span style="display: inline-block; position: relative; width: 1.816em; height: 0px;"><span style="position: absolute; clip: rect(1.976em 1000em 2.723em -0.424em); top: -2.557em; left: 0.003em;"><span class="mi" id="MathJax-Span-46321" style="font-family: MathJax_Math-italic;">e</span><span style="display: inline-block; width: 0px; height: 2.563em;"></span></span><span style="position: absolute; top: -2.344em; left: 0.483em;"><span class="texatom" id="MathJax-Span-46322"><span class="mrow" id="MathJax-Span-46323"><span class="mi" id="MathJax-Span-46324" style="font-size: 70.7%; font-family: MathJax_Math-italic;">k</span><span class="mo" id="MathJax-Span-46325" style="font-size: 70.7%; font-family: MathJax_Main;">−</span><span class="mn" id="MathJax-Span-46326" style="font-size: 70.7%; font-family: MathJax_Main;">1</span></span></span><span style="display: inline-block; width: 0px; height: 2.509em;"></span></span></span></span><span class="mo" id="MathJax-Span-46327" style="font-family: MathJax_Main; padding-left: 0.163em;">…</span><span class="msubsup" id="MathJax-Span-46328" style="padding-left: 0.163em;"><span style="display: inline-block; position: relative; width: 0.909em; height: 0px;"><span style="position: absolute; clip: rect(1.976em 1000em 2.723em -0.424em); top: -2.557em; left: 0.003em;"><span class="mi" id="MathJax-Span-46329" style="font-family: MathJax_Math-italic;">e</span><span style="display: inline-block; width: 0px; height: 2.563em;"></span></span><span style="position: absolute; top: -2.344em; left: 0.483em;"><span class="texatom" id="MathJax-Span-46330"><span class="mrow" id="MathJax-Span-46331"><span class="mn" id="MathJax-Span-46332" style="font-size: 70.7%; font-family: MathJax_Main;">1</span></span></span><span style="display: inline-block; width: 0px; height: 2.509em;"></span></span></span></span><span class="msubsup" id="MathJax-Span-46333"><span style="display: inline-block; position: relative; width: 0.909em; height: 0px;"><span style="position: absolute; clip: rect(1.976em 1000em 2.723em -0.424em); top: -2.557em; left: 0.003em;"><span class="mi" id="MathJax-Span-46334" style="font-family: MathJax_Math-italic;">e</span><span style="display: inline-block; width: 0px; height: 2.563em;"></span></span><span style="position: absolute; top: -2.344em; left: 0.483em;"><span class="texatom" id="MathJax-Span-46335"><span class="mrow" id="MathJax-Span-46336"><span class="mn" id="MathJax-Span-46337" style="font-size: 70.7%; font-family: MathJax_Main;">0</span></span></span><span style="display: inline-block; width: 0px; height: 2.509em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span></span><span style="border-left-width: 0.003em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 0.87em; vertical-align: -0.263em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-4279">e_{k-1}…e_{1}e_{0}</script>
      <nobr><span class="math" id="MathJax-Span-46338" style="width: 8.749em; display: inline-block;"><span style="display: inline-block; position: relative; width: 6.989em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(1.656em 1000em 2.883em -0.424em); top: -2.717em; left: 0.003em;"><span class="mrow" id="MathJax-Span-46339"><span class="mi" id="MathJax-Span-46340" style="font-family: MathJax_Math-italic;">B</span><span class="mi" id="MathJax-Span-46341" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-46342" style="font-family: MathJax_Math-italic;">a</span><span class="mi" id="MathJax-Span-46343" style="font-family: MathJax_Math-italic;">s</span><span class="mo" id="MathJax-Span-46344" style="font-family: MathJax_Main; padding-left: 0.269em;">=</span><span class="msubsup" id="MathJax-Span-46345" style="padding-left: 0.269em;"><span style="display: inline-block; position: relative; width: 1.869em; height: 0px;"><span style="position: absolute; clip: rect(1.923em 1000em 2.883em -0.424em); top: -2.717em; left: 0.003em;"><span class="mn" id="MathJax-Span-46346" style="font-family: MathJax_Main;">2</span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span><span style="position: absolute; top: -2.877em; left: 0.536em;"><span class="texatom" id="MathJax-Span-46347"><span class="mrow" id="MathJax-Span-46348"><span class="mi" id="MathJax-Span-46349" style="font-size: 70.7%; font-family: MathJax_Math-italic;">k</span><span class="mo" id="MathJax-Span-46350" style="font-size: 70.7%; font-family: MathJax_Main;">−</span><span class="mn" id="MathJax-Span-46351" style="font-size: 70.7%; font-family: MathJax_Main;">1</span></span></span><span style="display: inline-block; width: 0px; height: 2.509em;"></span></span></span></span><span class="mo" id="MathJax-Span-46352" style="font-family: MathJax_Main; padding-left: 0.216em;">−</span><span class="mn" id="MathJax-Span-46353" style="font-family: MathJax_Main; padding-left: 0.216em;">1</span></span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span></span><span style="border-left-width: 0.003em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.27em; vertical-align: -0.063em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-4280">Bias = 2^{k-1}-1</script>(单精度是127,双精度是1023)
      <nobr><span class="math" id="MathJax-Span-46354" style="width: 7.363em; display: inline-block;"><span style="display: inline-block; position: relative; width: 5.869em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(1.869em 1000em 2.883em -0.424em); top: -2.717em; left: 0.003em;"><span class="mrow" id="MathJax-Span-46355"><span class="mi" id="MathJax-Span-46356" style="font-family: MathJax_Math-italic;">E<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span><span class="mo" id="MathJax-Span-46357" style="font-family: MathJax_Main; padding-left: 0.269em;">=</span><span class="mi" id="MathJax-Span-46358" style="font-family: MathJax_Math-italic; padding-left: 0.269em;">e</span><span class="mo" id="MathJax-Span-46359" style="font-family: MathJax_Main; padding-left: 0.216em;">−</span><span class="mi" id="MathJax-Span-46360" style="font-family: MathJax_Math-italic; padding-left: 0.216em;">B</span><span class="mi" id="MathJax-Span-46361" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-46362" style="font-family: MathJax_Math-italic;">a</span><span class="mi" id="MathJax-Span-46363" style="font-family: MathJax_Math-italic;">s</span></span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span></span><span style="border-left-width: 0.003em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.003em; vertical-align: -0.063em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-4281">E = e-Bias</script>
      小数字段frac描述为小数值<nobr><span class="math" id="MathJax-Span-46364" style="width: 0.749em; display: inline-block;"><span style="display: inline-block; position: relative; width: 0.589em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(1.709em 1000em 2.936em -0.424em); top: -2.557em; left: 0.003em;"><span class="mrow" id="MathJax-Span-46365"><span class="mi" id="MathJax-Span-46366" style="font-family: MathJax_Math-italic;">f<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.056em;"></span></span></span><span style="display: inline-block; width: 0px; height: 2.563em;"></span></span></span><span style="border-left-width: 0.003em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.27em; vertical-align: -0.33em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-4282">f</script>,其中<nobr><span class="math" id="MathJax-Span-46367" style="width: 5.283em; display: inline-block;"><span style="display: inline-block; position: relative; width: 4.216em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(1.869em 1000em 3.096em -0.424em); top: -2.717em; left: 0.003em;"><span class="mrow" id="MathJax-Span-46368"><span class="mn" id="MathJax-Span-46369" style="font-family: MathJax_Main;">0</span><span class="mo" id="MathJax-Span-46370" style="font-family: MathJax_Main; padding-left: 0.269em;">≤</span><span class="mi" id="MathJax-Span-46371" style="font-family: MathJax_Math-italic; padding-left: 0.269em;">f<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.056em;"></span></span><span class="mo" id="MathJax-Span-46372" style="font-family: MathJax_Main; padding-left: 0.269em;">&lt;</span><span class="mn" id="MathJax-Span-46373" style="font-family: MathJax_Main; padding-left: 0.269em;">1</span></span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span></span><span style="border-left-width: 0.003em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.27em; vertical-align: -0.33em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-4283">0≤f<1</script>,其二进制表示为<nobr><span class="math" id="MathJax-Span-46374" style="width: 7.683em; display: inline-block;"><span style="display: inline-block; position: relative; width: 6.136em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(1.869em 1000em 3.149em -0.424em); top: -2.717em; left: 0.003em;"><span class="mrow" id="MathJax-Span-46375"><span class="mn" id="MathJax-Span-46376" style="font-family: MathJax_Main;">0.</span><span class="msubsup" id="MathJax-Span-46377"><span style="display: inline-block; position: relative; width: 1.923em; height: 0px;"><span style="position: absolute; clip: rect(1.709em 1000em 2.936em -0.424em); top: -2.557em; left: 0.003em;"><span class="mi" id="MathJax-Span-46378" style="font-family: MathJax_Math-italic;">f<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.056em;"></span></span><span style="display: inline-block; width: 0px; height: 2.563em;"></span></span><span style="position: absolute; top: -2.237em; left: 0.536em;"><span class="texatom" id="MathJax-Span-46379"><span class="mrow" id="MathJax-Span-46380"><span class="mi" id="MathJax-Span-46381" style="font-size: 70.7%; font-family: MathJax_Math-italic;">n</span><span class="mo" id="MathJax-Span-46382" style="font-size: 70.7%; font-family: MathJax_Main;">−</span><span class="mn" id="MathJax-Span-46383" style="font-size: 70.7%; font-family: MathJax_Main;">1</span></span></span><span style="display: inline-block; width: 0px; height: 2.509em;"></span></span></span></span><span class="mo" id="MathJax-Span-46384" style="font-family: MathJax_Main; padding-left: 0.163em;">…</span><span class="msubsup" id="MathJax-Span-46385" style="padding-left: 0.163em;"><span style="display: inline-block; position: relative; width: 0.963em; height: 0px;"><span style="position: absolute; clip: rect(1.709em 1000em 2.936em -0.424em); top: -2.557em; left: 0.003em;"><span class="mi" id="MathJax-Span-46386" style="font-family: MathJax_Math-italic;">f<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.056em;"></span></span><span style="display: inline-block; width: 0px; height: 2.563em;"></span></span><span style="position: absolute; top: -2.237em; left: 0.536em;"><span class="texatom" id="MathJax-Span-46387"><span class="mrow" id="MathJax-Span-46388"><span class="mn" id="MathJax-Span-46389" style="font-size: 70.7%; font-family: MathJax_Main;">1</span></span></span><span style="display: inline-block; width: 0px; height: 2.509em;"></span></span></span></span><span class="msubsup" id="MathJax-Span-46390"><span style="display: inline-block; position: relative; width: 0.963em; height: 0px;"><span style="position: absolute; clip: rect(1.709em 1000em 2.936em -0.424em); top: -2.557em; left: 0.003em;"><span class="mi" id="MathJax-Span-46391" style="font-family: MathJax_Math-italic;">f<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.056em;"></span></span><span style="display: inline-block; width: 0px; height: 2.563em;"></span></span><span style="position: absolute; top: -2.237em; left: 0.536em;"><span class="texatom" id="MathJax-Span-46392"><span class="mrow" id="MathJax-Span-46393"><span class="mn" id="MathJax-Span-46394" style="font-size: 70.7%; font-family: MathJax_Main;">0</span></span></span><span style="display: inline-block; width: 0px; height: 2.509em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span></span><span style="border-left-width: 0.003em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.337em; vertical-align: -0.397em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-4284">0.f_{n-1}…f_{1}f_{0}</script>
      <nobr><span class="math" id="MathJax-Span-46395" style="width: 5.816em; display: inline-block;"><span style="display: inline-block; position: relative; width: 4.643em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(1.869em 1000em 3.096em -0.424em); top: -2.717em; left: 0.003em;"><span class="mrow" id="MathJax-Span-46396"><span class="mi" id="MathJax-Span-46397" style="font-family: MathJax_Math-italic;">M<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.109em;"></span></span><span class="mo" id="MathJax-Span-46398" style="font-family: MathJax_Main; padding-left: 0.269em;">=</span><span class="mn" id="MathJax-Span-46399" style="font-family: MathJax_Main; padding-left: 0.269em;">1</span><span class="mo" id="MathJax-Span-46400" style="font-family: MathJax_Main; padding-left: 0.216em;">+</span><span class="mi" id="MathJax-Span-46401" style="font-family: MathJax_Math-italic; padding-left: 0.216em;">f<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.056em;"></span></span></span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span></span><span style="border-left-width: 0.003em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.27em; vertical-align: -0.33em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-4285">M = 1+f</script>
    • 非规格化的值:
      当阶码域为全0时,所表示的数就是非规格化形式。
      <nobr><span class="math" id="MathJax-Span-46402" style="width: 7.363em; display: inline-block;"><span style="display: inline-block; position: relative; width: 5.869em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(1.869em 1000em 2.883em -0.424em); top: -2.717em; left: 0.003em;"><span class="mrow" id="MathJax-Span-46403"><span class="mi" id="MathJax-Span-46404" style="font-family: MathJax_Math-italic;">E<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span><span class="mo" id="MathJax-Span-46405" style="font-family: MathJax_Main; padding-left: 0.269em;">=</span><span class="mn" id="MathJax-Span-46406" style="font-family: MathJax_Main; padding-left: 0.269em;">1</span><span class="mo" id="MathJax-Span-46407" style="font-family: MathJax_Main; padding-left: 0.216em;">−</span><span class="mi" id="MathJax-Span-46408" style="font-family: MathJax_Math-italic; padding-left: 0.216em;">B</span><span class="mi" id="MathJax-Span-46409" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-46410" style="font-family: MathJax_Math-italic;">a</span><span class="mi" id="MathJax-Span-46411" style="font-family: MathJax_Math-italic;">s</span></span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span></span><span style="border-left-width: 0.003em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.003em; vertical-align: -0.063em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-4286">E = 1-Bias</script>
      <nobr><span class="math" id="MathJax-Span-46412" style="width: 3.736em; display: inline-block;"><span style="display: inline-block; position: relative; width: 2.989em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(1.869em 1000em 3.096em -0.424em); top: -2.717em; left: 0.003em;"><span class="mrow" id="MathJax-Span-46413"><span class="mi" id="MathJax-Span-46414" style="font-family: MathJax_Math-italic;">M<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.109em;"></span></span><span class="mo" id="MathJax-Span-46415" style="font-family: MathJax_Main; padding-left: 0.269em;">=</span><span class="mi" id="MathJax-Span-46416" style="font-family: MathJax_Math-italic; padding-left: 0.269em;">f<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.056em;"></span></span></span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span></span><span style="border-left-width: 0.003em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.27em; vertical-align: -0.33em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-4287">M = f</script>
    • 特殊值:
      当阶码域为全1时出现。当小数域全为0时,得到的值表示无穷,s = 0 时是+ ∞, s = 1时是- ∞。当我们把两个非常大的数相乘,或者除以零时,无穷能够表示溢出的结果。当小数域为非零时,结果值被称为“NaN”,就是“不是一个数”(Not a Number)的缩写。

    下图展示了假定的8位浮点格式的示例,其中有<nobr><span class="math" id="MathJax-Span-46417" style="width: 2.936em; display: inline-block;"><span style="display: inline-block; position: relative; width: 2.349em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(1.869em 1000em 2.883em -0.424em); top: -2.717em; left: 0.003em;"><span class="mrow" id="MathJax-Span-46418"><span class="mi" id="MathJax-Span-46419" style="font-family: MathJax_Math-italic;">k</span><span class="mo" id="MathJax-Span-46420" style="font-family: MathJax_Main; padding-left: 0.269em;">=</span><span class="mn" id="MathJax-Span-46421" style="font-family: MathJax_Main; padding-left: 0.269em;">4</span></span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span></span><span style="border-left-width: 0.003em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.003em; vertical-align: -0.063em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-4288">k = 4</script>的阶码位和<nobr><span class="math" id="MathJax-Span-46422" style="width: 3.096em; display: inline-block;"><span style="display: inline-block; position: relative; width: 2.456em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(1.923em 1000em 2.883em -0.477em); top: -2.717em; left: 0.003em;"><span class="mrow" id="MathJax-Span-46423"><span class="mi" id="MathJax-Span-46424" style="font-family: MathJax_Math-italic;">n</span><span class="mo" id="MathJax-Span-46425" style="font-family: MathJax_Main; padding-left: 0.269em;">=</span><span class="mn" id="MathJax-Span-46426" style="font-family: MathJax_Main; padding-left: 0.269em;">3</span></span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span></span><span style="border-left-width: 0.003em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.003em; vertical-align: -0.063em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-4289">n = 3</script>的小数位。偏置量<nobr><span class="math" id="MathJax-Span-46427" style="width: 4.963em; display: inline-block;"><span style="display: inline-block; position: relative; width: 3.949em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(1.869em 1000em 2.883em -0.424em); top: -2.717em; left: 0.003em;"><span class="mrow" id="MathJax-Span-46428"><span class="mi" id="MathJax-Span-46429" style="font-family: MathJax_Math-italic;">B</span><span class="mi" id="MathJax-Span-46430" style="font-family: MathJax_Math-italic;">i</span><span class="mi" id="MathJax-Span-46431" style="font-family: MathJax_Math-italic;">a</span><span class="mi" id="MathJax-Span-46432" style="font-family: MathJax_Math-italic;">s</span><span class="mo" id="MathJax-Span-46433" style="font-family: MathJax_Main; padding-left: 0.269em;">=</span><span class="mn" id="MathJax-Span-46434" style="font-family: MathJax_Main; padding-left: 0.269em;">7</span></span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span></span><span style="border-left-width: 0.003em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.003em; vertical-align: -0.063em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-4290">Bias = 7</script>。规格化<nobr><span class="math" id="MathJax-Span-46435" style="width: 5.336em; display: inline-block;"><span style="display: inline-block; position: relative; width: 4.269em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(1.869em 1000em 2.883em -0.424em); top: -2.717em; left: 0.003em;"><span class="mrow" id="MathJax-Span-46436"><span class="mi" id="MathJax-Span-46437" style="font-family: MathJax_Math-italic;">E<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span><span class="mo" id="MathJax-Span-46438" style="font-family: MathJax_Main; padding-left: 0.269em;">=</span><span class="mi" id="MathJax-Span-46439" style="font-family: MathJax_Math-italic; padding-left: 0.269em;">e</span><span class="mo" id="MathJax-Span-46440" style="font-family: MathJax_Main; padding-left: 0.216em;">−</span><span class="mn" id="MathJax-Span-46441" style="font-family: MathJax_Main; padding-left: 0.216em;">7</span></span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span></span><span style="border-left-width: 0.003em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.003em; vertical-align: -0.063em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-4291">E = e-7</script>,非规格化<nobr><span class="math" id="MathJax-Span-46442" style="width: 4.216em; display: inline-block;"><span style="display: inline-block; position: relative; width: 3.363em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(1.869em 1000em 2.883em -0.424em); top: -2.717em; left: 0.003em;"><span class="mrow" id="MathJax-Span-46443"><span class="mi" id="MathJax-Span-46444" style="font-family: MathJax_Math-italic;">E<span style="display: inline-block; overflow: hidden; height: 1px; width: 0.003em;"></span></span><span class="mo" id="MathJax-Span-46445" style="font-family: MathJax_Main; padding-left: 0.269em;">=</span><span class="mo" id="MathJax-Span-46446" style="font-family: MathJax_Main; padding-left: 0.269em;">−</span><span class="mn" id="MathJax-Span-46447" style="font-family: MathJax_Main;">6</span></span><span style="display: inline-block; width: 0px; height: 2.723em;"></span></span></span><span style="border-left-width: 0.003em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.003em; vertical-align: -0.063em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-4292">E = -6</script>。小数f的值的范围0,<nobr><span class="math" id="MathJax-Span-46448" style="width: 0.963em; display: inline-block;"><span style="display: inline-block; position: relative; width: 0.749em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(1.283em 1000em 2.883em -0.477em); top: -2.344em; left: 0.003em;"><span class="mrow" id="MathJax-Span-46449"><span class="mfrac" id="MathJax-Span-46450"><span style="display: inline-block; position: relative; width: 0.483em; height: 0px; margin-right: 0.109em; margin-left: 0.109em;"><span style="position: absolute; clip: rect(1.869em 1000em 2.669em -0.424em); top: -2.931em; left: 50%; margin-left: -0.157em;"><span class="mn" id="MathJax-Span-46451" style="font-size: 70.7%; font-family: MathJax_Main;">1</span><span style="display: inline-block; width: 0px; height: 2.509em;"></span></span><span style="position: absolute; clip: rect(1.869em 1000em 2.669em -0.424em); top: -2.131em; left: 50%; margin-left: -0.157em;"><span class="mn" id="MathJax-Span-46452" style="font-size: 70.7%; font-family: MathJax_Main;">8</span><span style="display: inline-block; width: 0px; height: 2.509em;"></span></span><span style="position: absolute; clip: rect(0.856em 1000em 1.229em -0.477em); top: -1.277em; left: 0.003em;"><span style="border-left-width: 0.483em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.25px; vertical-align: 0.003em;"></span><span style="display: inline-block; width: 0px; height: 1.069em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 2.349em;"></span></span></span><span style="border-left-width: 0.003em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.737em; vertical-align: -0.53em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-4293">\frac{1}{8}</script>,…,<nobr><span class="math" id="MathJax-Span-46453" style="width: 0.963em; display: inline-block;"><span style="display: inline-block; position: relative; width: 0.749em; height: 0px; font-size: 125%;"><span style="position: absolute; clip: rect(1.283em 1000em 2.883em -0.477em); top: -2.344em; left: 0.003em;"><span class="mrow" id="MathJax-Span-46454"><span class="mfrac" id="MathJax-Span-46455"><span style="display: inline-block; position: relative; width: 0.483em; height: 0px; margin-right: 0.109em; margin-left: 0.109em;"><span style="position: absolute; clip: rect(1.869em 1000em 2.669em -0.424em); top: -2.931em; left: 50%; margin-left: -0.157em;"><span class="mn" id="MathJax-Span-46456" style="font-size: 70.7%; font-family: MathJax_Main;">7</span><span style="display: inline-block; width: 0px; height: 2.509em;"></span></span><span style="position: absolute; clip: rect(1.869em 1000em 2.669em -0.424em); top: -2.131em; left: 50%; margin-left: -0.157em;"><span class="mn" id="MathJax-Span-46457" style="font-size: 70.7%; font-family: MathJax_Main;">8</span><span style="display: inline-block; width: 0px; height: 2.509em;"></span></span><span style="position: absolute; clip: rect(0.856em 1000em 1.229em -0.477em); top: -1.277em; left: 0.003em;"><span style="border-left-width: 0.483em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.25px; vertical-align: 0.003em;"></span><span style="display: inline-block; width: 0px; height: 1.069em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 2.349em;"></span></span></span><span style="border-left-width: 0.003em; border-left-style: solid; display: inline-block; overflow: hidden; width: 0px; height: 1.737em; vertical-align: -0.53em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-4294">\frac{7}{8}</script>。
    信息的表示和处理

    根据其表现形式,我们可以知道浮点数的表示范围及精度:
    信息的表示和处理

  • 浮点数的舍入
    IEEE浮点格式定义了四种不同的舍入方式:
    信息的表示和处理
    其中,向偶数舍入又称为最近舍入,这种方式与四舍五入唯一的不同就是对.5的舍入上,采用取偶数的方式。这样是为了避免统计偏差。默认的舍入方式为向偶数舍入。

  • 浮点数的运算
    浮点数运算通过一定的步骤,阶码与尾数貌似分别计算,具体暂不做了解。
    浮点运算只有有限的范围和精度,而且不遵守普遍的算术属性,比如结合性。使用的时候需要小心。