Atri Website

Back

核心内容#

  1. IEEE 754 浮点数的存储格式(表示方式),尤其是单精度✅️
  2. IEEE 754 规格化的表示范围✅️
  3. 真值和浮点数之间的转换计算✅️
  4. 超出规格范围(溢出)后的处理(二轮再回来看)
  5. 几种特殊状态:阶码全 1/0
  6. 浮点数的加减运算(二轮再说)
  7. 数据的存储方式:大端、小端✅️

表示#

浮点数采用科学计数法记录。

一个浮点数由符号位 s、阶数 e、尾数 f 和基数 R 组成,例如 +3.026×1011+ 3.026 \times 10^{11},从左到右分别为:s f ×Res\ f \ \times R^{e}

规格化:把尾数最高位的非 0 数位正好在小数点之前。

1

例如图中的两个非规格表示,其规格化表示为:

2

由此,引出二进制下的规格化浮点数:基数 R 默认是 2,而它同样由符号位、阶数、尾数、基数组成。

3

这样,将浮点数规格化后,可方便采用规范化格式将浮点数存储于计算机。

存储格式#

4

IEEE 754 有两种精度:32 位和 64。

s f × Res\ f \ \times\ R^{e}

在 32 位单精度格式,它包含 1 位符号位、8 位阶码、23 位尾数。由于规格化的二进制浮点数,其尾数小数点前一位一定是 1,且默认 R=2(二进制),因此可以不显示最高位的 1,我们常称其为隐藏位。这样 f 虽然只有 23 bit,但实际表示的是 24 bit 的有效数字。例如 (12)10=(1100)2(12)_{10} = (1100)_2,规格化表示为 +1.100×23+1.100\times 2^3,实际上存储时,f=100 ......f=100\ ...... ,小数点前的 “1” 并不实际存储,阶码保存的是 3 的编码值。

64 位的处理和 32 位一样,只是阶码和尾数的位数不同。

阶码表示的是可存储的数值范围,后续展开说明。

5

阶码采用移码方式表示,且偏置值为 2n112^{n-1}-1,因此 32 位和 64 位的偏置值分别为 127 和 1023。这样实际 32 位浮点数的阶码的存储为:

e+127=rese + 127 = res

res 才是要存储的二进制值的十进制表示。

偏置值是移码的一种形式,可以类比于模电中的直流偏置,即在原信号的基础上提供一个直流偏置

例如图中阶码是 2,所以 res = 129,存储的就是 129 的二进制值(移码只是告诉你存储的形式,实际上计算没用到)

真值表示#

IEEE 754 32 位浮点数的真值表示:

(1)s×1.f×2e127(-1)^s\times 1.f \times 2^{e-127}

64 位的真值表示:

(1)s×1.f×2e1023(-1)^s\times 1.f \times 2^{e-1023}

其中单精度浮点数的 e 取值范围为:12541 \to 254(全 0 和全 1 用于特殊表示),双精度为:120461\to 2046(用途相同)。

取值范围#

由上面阶码 e 的取值范围,实际上可以得到单精度和双精度的绝对值表示范围。

上面是阶码 无符号整数 的二进制表示范围,而以下需要先转为真值(减去偏置值)。

以 32 位为例子,其阶码在二进制中由于不能全 0 或全 1,因此二进制表示为 0000 00011111 1110,转为十进制就是 1254;再减去偏置值 127,得到阶码的真值范围:-126 ~ 127

因此 32 位能表示的最小值,它的真值的阶码是 -126,尾数是 1.0;最大值的阶码是 +127,和下表相同。

位数最小值最大值
单精度(32 位)
1+8+23
e=1,f=0e=1,f=0
真值为1.0×211271.0 \times 2^{1-127}
e=254,f=.111...e=254,f=.111...
真值为1.111...×2254127=2127×(21223)1.111...\times 2^{254-127}=2^{127}\times(2^1-2^{-23})
双精度(64 位)
1+11+52
e=1,f=0e=1,f=0
真值为1.0×2110231.0 \times 2^{1-1023}
e=2046,f=.111...e=2046,f=.111...
真值为1.111...×220461023=21023×(21252)1.111...\times 2^{2046-1023}=2^{1023}\times(2^1-2^{-52})

疑惑2127×(21223)2^{127}\times(2^1-2^{-23}) 是由于小数部分的原码(真值)的二进制表示是 ---- 不懂

十进制真值与二进制单精度浮点数的转换#

6

以这个例题说明。

  1. 先把真值 6.75-6.75 转为二进制表示,再转为规格化的二进制科学计数法。
  2. 注意我们的构造表达式:(1)s×1.f×2e127(-1)^s\times 1.f \times 2^{e-127}
  3. 由规格化浮点数式子可知:s=1e=2f=(1).1011s=1,e=2,f=(1).1011
  4. 由偏置值公式:res=e127res= e-127 得到 res=129res=129,进而得到阶码的移码(129 的二进制值)
  5. 最后对尾数进行扩充,直到 23 bit 。
  6. 使用十六进制写出结果

而将 32 位浮点数转为十进制真值同理,只要记得偏置值和阶码的转换关系即可。

几种特殊状态的浮点数#

7

数据的宽度和存储#

大小端介绍可点击链接。

大端、小端格式存储#

  1. 一个 32 位 字 0x12345678,---- 即 4 字节
    • 若采用大端方式存储,则在内存中的排列是:12 34 56 78
    • 若采用小端方式存储,则为: 78 56 34 12
  2. ARM 存储字数据有两种方式,即大端格式和小端格式,如果有一个 32 位 字 0x12345678 存放的起始地址为 0x0004 0000,在两种格式下分别如何存放?计算机通常情况默认为什么格式?
    • 起始地址为 0x0004 0000。由于是 32 位字(4 字节),它将占用 0x0004 0000、0x0004 0001、0x0004 0002、0x0004 0003 这四个内存地址。
    • 在大端格式下 (Big-Endian):
      • 最高有效字节 0x12 存储在最低地址 0x0004 0000。
      • 次高有效字节 0x34 存储在 0x0004 0001。
      • 次低有效字节 0x56 存储在 0x0004 0002。
      • 最低有效字节 0x78 存储在最高地址 0x0004 0003。

大端格式与小端格式:

  • 大端格式(Big-Endian)
    • 指数据的高位字节 (Most Significant Byte, MSB) 存放在内存的低地址
    • 数据的低位字节 (Least Significant Byte, LSB) 存放在内存的高地址处。
    • 简单记就是“高位在前,低位在后”。
  • 小端格式 (Little-Endian)
    • 指数据的低位字节存放在内存的低地址处。
    • 数据的高位字节存放在内存的高地址处。
    • 可以记作“低位在前,高位在后” (相对于内存地址的增长方向)。

MSB (Most Significant Byte):指的是最高有效字节,也就是数据在内存里存储的最高位字节

LSB:反之。

例子:32 位计算机中,一个 int 型变量 i 的机器数位 01 23 45 67H,那么它的 MSB = 01H,LSB=67H(01 在数据中是高位字节 MSB)

IEEE754 浮点数
Author Juyao Huang
Published at March 18, 2026
Comment seems to stuck. Try to refresh?✨