• C++
  • 定点小数和浮点小数 小数的数据编码教程

  • @ 2025-8-5 10:21:01

小数的原码、反码、补码编码教程

小数的原码、反码、补码表示方法是整数编码的扩展,主要用于在计算机中表示带小数部分的数值。与整数编码相比,小数编码需要特别处理小数点的位置,通常两种常见的表示方式:定点小数浮点小数。这里主要介绍定点小数的编码规则。

一、定点小数的表示方法

定点小数是指小数点位置固定的小数,通常将小数点固定在符号位和数值位之间,结构如下:

符号位 . 数值位
  1位   |  n位

例如,8位定点小数的结构为:1位符号位 + 7位数值位,小数点位于符号位与数值位之间。

  • 符号位:0表示正数,1表示负数
  • 数值位:表示小数的有效数字

二、定点小数的原码

定义

小数原码的表示规则与整数类似:

  • 正数:符号位为0,数值位为该小数的二进制表示
  • 负数:符号位为1,数值位为该小数绝对值的二进制表示

生成方法

  1. 确定符号位(0为正,1为负)
  2. 将小数的绝对值转换为二进制表示
  3. 不足指定位数时,在低位补0

示例(8位定点小数)

  • +0.5的原码:0.1000000

    • 符号位0(正数),数值位1000000(0.5的二进制)
  • -0.5的原码:1.1000000

    • 符号位1(负数),数值位1000000(0.5的二进制)
  • +0.25的原码:0.0100000

  • -0.25的原码:1.0100000

三、定点小数的反码

定义

  • 正数的反码与原码相同
  • 负数的反码:符号位不变,数值位逐位取反(0变1,1变0)

生成方法

  1. 先求出该小数的原码
  2. 若为正数,反码与原码相同
  3. 若为负数,保持符号位不变,将数值位的每一位取反

示例(8位定点小数)

  • +0.5的原码:0.1000000 → 反码:0.1000000

  • -0.5的原码:1.1000000 → 反码:1.0111111

    • 符号位保持1不变,数值位1000000取反为0111111
  • +0.375的原码:0.0110000 → 反码:0.0110000

  • -0.375的原码:1.0110000 → 反码:1.1001111

四、定点小数的补码

定义

  • 正数的补码与原码、反码相同
  • 负数的补码:其反码加1(二进制加法,低位向高位进位)

生成方法

  1. 先求出该小数的反码
  2. 若为正数,补码与反码相同
  3. 若为负数,补码 = 反码 + 1(二进制加法)

示例(8位定点小数)

  • +0.5的反码:0.1000000 → 补码:0.1000000

  • -0.5的反码:1.0111111 → 补码:1.1000000

    • 反码1.0111111加1得1.1000000
  • +0.125的补码:0.0010000

  • -0.125的原码:1.0010000 → 反码:1.1101111 → 补码:1.1110000

五、小数编码的范围

以8位定点小数(1位符号位+7位数值位)为例:

  • 原码和反码的表示范围:-(1-2⁻⁷) ~ +(1-2⁻⁷),即-0.9921875 ~ +0.9921875
  • 补码的表示范围:-1 ~ +(1-2⁻⁷),即-1 ~ +0.9921875

补码能多表示-1这个数,原因与整数补码类似,它利用了原码和反码中±0占用的编码空间。

六、小数补码的运算

小数补码的运算规则与整数补码相同:

  1. 两个数的补码相加,结果为和的补码
  2. 符号位与数值位一起参与运算
  3. 运算结果需判断是否溢出

示例

计算 0.25 + (-0.125):

  • 0.25的8位补码:0.0100000
  • -0.125的8位补码:1.1110000
  • 相加:0.0100000 + 1.1110000 = 0.0010000(补码)
  • 转换为原码:0.0010000 → 0.125(正确结果)

七、浮点小数简介

定点小数表示范围有限,实际应用中更多使用浮点数,其编码遵循IEEE 754标准,结构为:

  • 符号位:1位(0为正,1为负)
  • 指数位:表示阶码(偏移值存储)
  • 尾数位:表示有效数字

浮点数的原码、反码、补码概念相对复杂,通常直接使用IEEE 754标准规定的编码方式,而非简单的原码、反码、补码形式。

通过上述内容,可以掌握小数的原码、反码、补码表示方法,它们与整数编码的原理一致,只是小数点位置固定,这为计算机处理小数运算提供了基础。

8 条评论

  • @ 2025-8-16 9:57:32

    要计算1的float编码(32位IEEE 754单精度浮点数),需按照符号位、指数位和尾数位三部分进行拆解:

    步骤1:将1转换为二进制并规范化

    • 十进制1的二进制表示为1.0
    • 规范化后为1.0 × 2^0(符合IEEE 754的1.xxxx... × 2^指数格式)

    步骤2:确定符号位

    • 1是正数,符号位为0(1位)

    步骤3:计算指数位

    • 规范化后的指数为0
    • float类型的指数偏移量为127,因此实际存储的指数值为0 + 127 = 127
    • 127转换为8位二进制是01111111(8位)

    步骤4:确定尾数位

    • 规范化后去掉整数部分的1,剩余小数部分为0
    • 尾数位共23位,全部填充0,即00000000000000000000000(23位)

    最终编码

    将三部分组合,1的float编码为:

    二进制完整表示为:00111111100000000000000000000000,对应的十六进制为0x3F800000

    • @ 2025-8-16 9:56:48

      在IEEE 754标准中,float类型占用32位,由1位符号位、8位指数位和23位尾数位组成。下面是将十进制数0.9999999转换为float编码的步骤:

      1. 将十进制小数转换为二进制小数

      采用乘2取整法:

      • 0.9999999 * 2 = 1.9999998,整数部分为1,小数部分为0.9999998
      • 0.9999998 * 2 = 1.9999996,整数部分为1,小数部分为0.9999996
      • 不断重复这个过程,得到二进制小数近似为0.11111111111111111111111 (实际是无限接近但略小于1的数,这里取23位)。 规范化二进制形式为1.11111111111111111111110 × 2^(-1) (因为规范化形式要求二进制数为1.xxxxxx的形式)。

      2. 确定符号位

      因为0.9999999是正数,所以符号位为0

      3. 计算指数位

      对于float类型,指数的偏移量是127。真实指数是 -1,那么加上偏移量后的指数值为 -1 + 127 = 126。 将126转换为8位二进制数,即01111110

      4. 确定尾数位

      规范化后的二进制小数1.11111111111111111111110去掉整数部分的1,取23位,得到尾数位为11111111111111111111110

      5. 组合得到float编码

      将符号位、指数位和尾数位按顺序组合起来,得到0.9999999float编码: 0 01111110 11111111111111111111110 ,即32位二进制表示为:00111111011111111111111111111110

      • @ 2025-8-16 9:42:21

        floatdouble是C、C++等编程语言中用于表示浮点数的数据类型,它们基于IEEE 754标准进行存储,所能表示的有效小数位数是由其精度决定的 ,以下是具体说明:

        float(单精度浮点数)

        • 存储结构:在IEEE 754标准中,float类型占用32位内存空间,其中1位用于表示符号(0表示正数,1表示负数),8位用于表示指数,23位用于表示尾数(mantissa )。
        • 有效位数:由于尾数部分的特性,float类型大约可以表示6 - 7位有效十进制数字。这意味着对于小数而言,从第一个非零数字开始,大约能保证6 - 7位数字的准确性。 例如,float类型表示3.1415926,实际存储和读取时,可能会出现细微偏差,因为它无法精确表示这么多有效位。一般来说,对于简单的科学计算、图形处理等对精度要求不是特别高的场景,float类型基本可以满足需求。

        double(双精度浮点数)

        • 存储结构double类型占用64位内存空间,其中1位用于符号位,11位用于表示指数,52位用于表示尾数。
        • 有效位数double类型的精度更高,大约可以表示15 - 17位有效十进制数字。这使得在大多数科学计算、金融计算等对精度要求较高的领域,double类型被广泛使用。 例如,在计算圆周率π时,使用double类型可以获得相对更精确的结果,能满足很多高精度计算的需求。

        需要注意的是,这里说的是有效数字位数,而不是固定的小数位数 。因为对于不同量级的浮点数(如1.231230000),有效数字的位置和范围是不同的。而且,由于浮点数在计算机中的存储方式(二进制表示),有些十进制小数无法精确地转换为二进制浮点数(如0.1),这可能会导致在进行浮点数运算时出现精度误差。

        • @ 2025-8-16 9:29:51

          在使用 IEEE 754 标准(常见的浮点数编码方式,如 C/C++、Java 等语言中的 float/double )时,无法精确表示的小数主要是那些十进制小数转换为二进制后是无限循环小数的数,本质原因是二进制浮点数的编码机制(以 2 的幂次和尾数组合来近似表示实数),无法精准契合所有十进制小数的数值特征,核心规律是:

          一、关键判断逻辑

          十进制小数能否精确表示为 IEEE 754 浮点数,取决于其最简分数形式的分母质因数分解是否仅含 2 。即:
          若十进制小数可表示为 a / bab 为整数,b > 0 且互质),且 b 的质因数只有 2(如 b = 2^nn 为非负整数 ),则该小数可精确表示为二进制浮点数;反之,若 b 含 2 以外的质因数(如 3、5、7 等),则无法精确表示。

          二、典型无法精确表示的小数

          日常开发中,最常见的无法精确表示的小数是分母含 5 的十进制小数(因十进制小数转分数时,分母常含 10 的因子,而 10 = 2×5 ,若约分后分母仍有 5 残留,就无法仅用 2 的幂次表示 ),例如:

          • 0.1:最简分数是 1/10 = 1/(2×5) ,分母含 5 ,无法精确表示。实际存储为近似值(如 double 类型的 0.1 ,二进制存储是无限循环小数的截断近似 )。
          • 0.2:最简分数 1/5 ,分母含 5 ,无法精确表示。
          • 0.3:最简分数 3/10 = 3/(2×5) ,分母含 5 ,无法精确表示。
          • 0.01:最简分数 1/100 = 1/(2²×5²) ,分母含 5 ,无法精确表示。
          • 0.001:最简分数 1/1000 = 1/(2³×5³) ,分母含 5 ,无法精确表示。

          此外,含其他质因数分母的小数 也无法精确表示,例如:

          • 0.333...1/3 ):分母含 3 ,无法精确表示。
          • 0.142857...1/7 ):分母含 7 ,无法精确表示。

          三、可精确表示的小数示例

          若十进制小数的最简分数分母仅含 2 ,则可精确表示,例如:

          • 0.51/2 ,分母是 ,可精确表示(二进制 0.1 )。
          • 0.251/4 = 1/2² ,可精确表示(二进制 0.01 )。
          • 0.753/4 = 3/2² ,可精确表示(二进制 0.11 )。
          • 0.1251/8 = 1/2³ ,可精确表示(二进制 0.001 )。

          四、开发中的避坑建议

          因浮点数的精度问题,涉及金额计算、百分比精确对比等场景时,需特别注意:

          1. 避免直接用 == 比较浮点数:因存储是近似值,0.1 + 0.2 == 0.3 这类逻辑可能不成立(实际 0.1 + 0.2 的结果是 0.30000000000000004 )。可改用差值小于极小精度(如 1e-9 )判断:
            if (fabs(a - b) < 1e-9) { /* 认为相等 */ }
            
          2. 金额场景用整数替代:例如用“分”代替“元”(1.23 元存为 123 分 ),通过整数运算避免浮点误差。
          3. 科学计算场景用高精度库:如 Python 的 decimal 模块、C++ 的 boost::multiprecision ,可自定义精度,适配金融、科研等对精度敏感的需求。

          总结来说,只要理解“分母质因数是否仅含 2”的核心规则,就能快速判断十进制小数能否精确表示为 IEEE 754 浮点数,开发时也能针对性规避精度问题。

          • @ 2025-8-16 9:18:18

            在计算机中,浮点数通常按照IEEE 754标准进行编码,分为单精度(32位)和双精度(64位),以下是0.1在这两种精度下的编码表示:

            单精度浮点数(32位)

            IEEE 754标准的单精度浮点数格式由符号位(1位)、**指数位(8位)尾数位(23位)**三部分组成,具体编码步骤如下:

            1. 将十进制小数转换为二进制小数: 采用乘2取整法,将0.1不断乘以2,取整数部分作为二进制小数的一位,小数部分继续乘以2,直到小数部分为0或者达到所需精度。
              • 0.1 * 2 = 0.2,整数部分为0
              • 0.2 * 2 = 0.4,整数部分为0
              • 0.4 * 2 = 0.8,整数部分为0
              • 0.8 * 2 = 1.6,整数部分为1,小数部分为0.6
              • 0.6 * 2 = 1.2,整数部分为1,小数部分为0.2
              • 继续计算会发现进入循环,所以0.1(十进制)近似等于0.00011001100110011001100...(二进制,无限循环)。规范化后表示为1.10011001100110011001100... × 2^(-4)
            2. 确定符号位0.1是正数,所以符号位为0
            3. 计算指数位:对于单精度浮点数,指数的偏移量为127。真实指数是 -4,那么加上偏移量后的指数值为-4 + 127 = 123,转换为8位二进制是01111011
            4. 确定尾数位:规范化后的二进制小数1.10011001100110011001100...去掉整数部分的1,取23位得到10011001100110011001101(这里进行了截断近似处理,因为无限循环,实际计算机会进行舍入操作)。

            所以,0.1的单精度浮点数编码是0 01111011 10011001100110011001101

            双精度浮点数(64位)

            IEEE 754标准的双精度浮点数格式由符号位(1位)、**指数位(11位)尾数位(52位)**三部分组成,步骤与单精度类似:

            1. 同样将0.1转换为二进制小数,规范化后为1.10011001100110011001100... × 2^(-4)
            2. 确定符号位:因为是正数,符号位为0
            3. 计算指数位:双精度浮点数指数的偏移量为1023,真实指数是 -4,加上偏移量后的指数值为-4 + 1023 = 1019,转换为11位二进制是01111110011
            4. 确定尾数位:去掉规范化二进制小数整数部分的1,取52位,得到1001100110011001100110011001100110011001100110011010 (同样进行了截断近似处理)。

            所以,0.1的双精度浮点数编码是0 01111110011 1001100110011001100110011001100110011001100110011010

            由于十进制小数0.1不能精确地表示为二进制浮点数,所以在实际存储和运算中会存在一定的精度误差。

            • @ 2025-8-5 19:20:03

              以下是几个浮点数的IEEE 754单精度编码实例,通过具体数值展示浮点数如何转换为二进制表示:

              示例1:正整数 8.0

              1. 十进制转二进制:8.0₁₀ = 1000.0₂
              2. 规范化科学计数法:1.000 × 2³
              3. 各部分解析
                • 符号位(s):0(正数)
                • 指数(E):3 + 127 = 130 → 二进制 10000010
                • 尾数(M):000...000(共23位,省略整数部分的1)
              4. 完整32位编码0 10000010 00000000000000000000000
              5. 十六进制表示:0x41000000

              示例2:小数 0.125

              1. 十进制转二进制:0.125₁₀ = 0.001₂
              2. 规范化科学计数法:1.0 × 2⁻³
              3. 各部分解析
                • 符号位(s):0(正数)
                • 指数(E):-3 + 127 = 124 → 二进制 01111100
                • 尾数(M):000...000(共23位)
              4. 完整32位编码0 01111100 00000000000000000000000
              5. 十六进制表示:0x3E000000

              示例3:负数 -3.14159

              1. 十进制转二进制:3.14159₁₀ ≈ 11.001001000011111101101₂
              2. 规范化科学计数法:1.1001001000011111101101 × 2¹
              3. 各部分解析
                • 符号位(s):1(负数)
                • 指数(E):1 + 127 = 128 → 二进制 10000000
                • 尾数(M):10010010000111111011010(23位)
              4. 完整32位编码1 10000000 10010010000111111011010
              5. 十六进制表示:0xC0490FDB

              示例4:特殊值 - 无穷大

              1. 表示方式:指数全为1,尾数全为0
              2. 各部分解析
                • 符号位(s):1(负无穷)
                • 指数(E):11111111(全1)
                • 尾数(M):000...000(全0)
              3. 完整32位编码1 11111111 00000000000000000000000
              4. 十六进制表示:0xFF800000
              • @ 2025-8-5 19:19:26

                浮点数数据编码教程

                浮点数的编码是计算机科学中一个重要的基础概念,它定义了如何在二进制系统中表示和存储小数。本教程将详细介绍浮点数的编码原理和实现方式。

                浮点数编码的基本原理

                在计算机中,浮点数通常采用IEEE 754标准进行编码,这种编码方式类似于科学计数法,将一个浮点数表示为:

                V = (-1)^s × M × 2^E

                其中:

                • s 是符号位,0表示正数,1表示负数
                • M 是尾数(有效数字),范围通常是[1, 2)
                • E 是指数,用于表示小数点的位置

                IEEE 754单精度浮点数(32位)

                单精度浮点数使用32位进行表示:

                • 1位符号位(s)
                • 8位指数位(exp)
                • 23位尾数位(frac)

                编码规则

                1. 符号位(s):直接表示正负
                2. 指数位(exp):
                  • 非规格化数:exp全为0
                  • 规格化数:exp既不全为0也不全为1
                  • 特殊值:exp全为1(表示无穷大或NaN)
                3. 尾数位(frac):表示有效数字的小数部分

                以下是一个将浮点数转换为IEEE 754单精度表示的C++实现,包含了编码和解码功能,并提供了详细的示例说明:

                #include <iostream>
                #include <cstdint>
                #include <bitset>
                #include <iomanip>
                
                // 将浮点数转换为IEEE 754单精度表示(32位)
                uint32_t float_to_ieee754(float f) {
                    // 使用联合体进行类型转换(安全的位操作方式)
                    union {
                        float f;
                        uint32_t u;
                    } converter;
                    
                    converter.f = f;
                    return converter.u;
                }
                
                // 将IEEE 754单精度表示转换回浮点数
                float ieee754_to_float(uint32_t ieee) {
                    union {
                        uint32_t u;
                        float f;
                    } converter;
                    
                    converter.u = ieee;
                    return converter.f;
                }
                
                // 解析并打印IEEE 754单精度表示的各个部分
                void print_ieee754_components(uint32_t ieee) {
                    // 提取符号位(1位)
                    uint8_t sign = (ieee >> 31) & 0x1;
                    
                    // 提取指数位(8位)
                    uint8_t exponent = (ieee >> 23) & 0xFF;
                    
                    // 提取尾数位(23位)
                    uint32_t fraction = ieee & 0x7FFFFF;
                    
                    // 计算偏移后的指数值(单精度偏移量为127)
                    int32_t biased_exponent = static_cast<int32_t>(exponent) - 127;
                    
                    std::cout << "符号位: " << static_cast<int>(sign) << " (" << (sign ? "-" : "+") << ")" << std::endl;
                    std::cout << "指数位: 0x" << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(exponent)
                              << " (" << std::dec << static_cast<int>(exponent) << ")" << std::endl;
                    std::cout << "偏移后指数: " << biased_exponent << std::endl;
                    std::cout << "尾数位: 0x" << std::hex << std::setw(6) << std::setfill('0') << fraction << std::endl;
                    
                    // 打印二进制表示
                    std::cout << "二进制表示: " << std::bitset<1>(sign) << " "
                              << std::bitset<8>(exponent) << " "
                              << std::bitset<23>(fraction) << std::endl;
                }
                
                int main() {
                    // 测试案例1:正数
                    float num1 = 3.14159f;
                    uint32_t ieee1 = float_to_ieee754(num1);
                    std::cout << "测试浮点数: " << num1 << std::endl;
                    std::cout << "IEEE 754十六进制: 0x" << std::hex << std::setw(8) << std::setfill('0') << ieee1 << std::dec << std::endl;
                    print_ieee754_components(ieee1);
                    
                    // 验证转换
                    float recon1 = ieee754_to_float(ieee1);
                    std::cout << "重构的浮点数: " << recon1 << std::endl;
                    std::cout << "误差: " << std::abs(num1 - recon1) << "\n" << std::endl;
                    
                    // 测试案例2:负数
                    float num2 = -0.125f;
                    uint32_t ieee2 = float_to_ieee754(num2);
                    std::cout << "测试浮点数: " << num2 << std::endl;
                    std::cout << "IEEE 754十六进制: 0x" << std::hex << std::setw(8) << std::setfill('0') << ieee2 << std::dec << std::endl;
                    print_ieee754_components(ieee2);
                    
                    // 验证转换
                    float recon2 = ieee754_to_float(ieee2);
                    std::cout << "重构的浮点数: " << recon2 << "\n" << std::endl;
                    
                    // 测试案例3:特殊值 - 无穷大
                    float inf = 1.0f / 0.0f;
                    uint32_t ieee_inf = float_to_ieee754(inf);
                    std::cout << "测试特殊值: " << inf << std::endl;
                    print_ieee754_components(ieee_inf);
                    
                    // 测试案例4:特殊值 - NaN
                    float nan = 0.0f / 0.0f;
                    uint32_t ieee_nan = float_to_ieee754(nan);
                    std::cout << "\n测试特殊值: " << nan << std::endl;
                    print_ieee754_components(ieee_nan);
                    
                    return 0;
                }
                    
                

                代码解析

                这个C++实现主要包含以下几个核心部分:

                1. 联合体转换:使用C++联合体(union)实现浮点数和32位无符号整数之间的安全转换,这是处理位级操作的高效方式。

                2. 编码函数float_to_ieee754将float类型转换为对应的32位IEEE 754表示,返回一个uint32_t类型。

                3. 解码函数ieee754_to_float将32位IEEE 754表示转换回float类型。

                4. 解析函数print_ieee754_components分解32位表示为符号位、指数位和尾数位,并计算偏移后的指数值,以人类可读的方式展示。

                5. 测试案例:main函数中包含了对普通正数、负数以及特殊值(无穷大、NaN)的测试,验证了编码和解码的正确性。

                实现要点

                • 使用uint32_t确保精确的32位表示
                • 通过位运算(>>&)提取各个组成部分
                • 处理了单精度浮点数的127偏移量
                • 展示了完整的二进制和十六进制表示
                • 包含了特殊值的处理和展示

                编译并运行此程序,可以清晰地看到浮点数在计算机内部的存储方式,帮助理解IEEE 754标准的具体实现。

                • @ 2025-8-5 19:15:34

                  在计算机中,浮点小数的编码方式遵循国际标准 IEEE 754,它通过科学计数法的思想表示小数,解决了原码、反码、补码在小数表示上的局限性(如范围有限、精度不一致等)。以下是IEEE 754浮点小数编码的详细教程:

                  一、IEEE 754的核心思想

                  浮点小数通过 符号位、指数位、尾数位 三部分表示,形式为:
                  数值 = (-1)^符号位 × 尾数位 × 2^指数位

                  • 符号位:0表示正数,1表示负数;
                  • 指数位:决定数值的量级(类似科学计数法中的“10的多少次方”);
                  • 尾数位:决定数值的精度(类似科学计数法中的“有效数字”)。

                  二、两种常用格式

                  IEEE 754定义了多种精度的浮点格式,最常用的是:

                  格式 总位数 符号位 指数位 尾数位 表示范围(近似)
                  单精度(float) 32位 1位 8位 23位 ±1.175×10⁻³⁸ ~ ±3.403×10³⁸
                  双精度(double) 64位 11位 52位 ±2.225×10⁻³⁰⁸ ~ ±1.798×10³⁰⁸

                  三、各部分的编码规则

                  1. 符号位(S)

                  • 仅1位,直接表示正负:
                    • S=0 → 正数;
                    • S=1 → 负数。

                  2. 指数位(E):偏移值修正

                  指数位采用 偏移码 表示(而非补码),目的是统一处理正负指数,避免单独的符号位。

                  • 偏移值(bias):根据指数位长度确定,公式为 bias = 2^(指数位位数-1) - 1
                    • 单精度(8位指数):bias = 127(2⁷-1=127);
                    • 双精度(11位指数):bias = 1023(2¹⁰-1=1023)。
                  • 实际指数(e)与存储的指数位(E)的关系:
                    e = E - bias
                    例如:单精度中,若E=128,则实际指数e=128-127=+1;若E=126,则e=126-127=-1。

                  3. 尾数位(M):隐含整数位

                  尾数位采用 规格化表示,默认整数部分为1(节省1位存储空间),因此实际有效位数比存储的尾数位多1位:

                  • 存储的尾数位为M(如单精度23位),实际尾数为 1.M(二进制),即 1 + M的二进制值
                  • 例如:单精度尾数位存储1010...(23位),实际尾数为1.1010...(二进制)。

                  四、完整编码示例(单精度)

                  以单精度(32位)表示小数 5.25 为例,步骤如下:

                  1. 转换为二进制小数
                    5.25(十进制)= 101.01(二进制)(整数部分5=101,小数部分0.25=0.01)。
                  2. 规格化表示
                    101.01 = 1.0101 × 2²(类似科学计数法,小数点左移2位)。
                  3. 拆分三部分
                    • 符号位S:正数 → S=0;
                    • 指数e:2 → 存储的指数位E = e + bias = 2 + 127 = 129(二进制:10000001);
                    • 尾数位M:去掉整数位“1”,保留小数部分0101 → 不足23位补0,即01010000000000000000000
                  4. 最终编码
                    符号位(0)+ 指数位(10000001)+ 尾数位(0101...) → 0 10000001 01010000000000000000000

                  五、特殊值的编码

                  IEEE 754定义了几种特殊情况(以单精度为例):

                  指数位(E) 尾数位(M) 表示的值
                  00000000 000...000 +0 或 -0(取决于S)
                  非全0 非规格化数(±0.M × 2⁻¹²⁶)
                  11111111 000...000 +∞ 或 -∞(取决于S)
                  非全0 NaN(Not a Number,无效值)

                  六、与整数编码的区别

                  • 整数的原码/反码/补码仅适用于整数,无法直接表示小数;
                  • 浮点小数通过IEEE 754实现了大范围、高精度的表示,但其编码规则更复杂(涉及偏移指数、隐含位等);
                  • 浮点运算(如加减乘除)的逻辑也与整数不同,需要先对齐指数位,再运算尾数位。

                  通过IEEE 754,计算机能够统一处理各种大小和精度的小数,是现代编程(如C++的floatdouble)和硬件实现的基础。理解其编码规则有助于深入掌握浮点数的精度问题(如“0.1无法精确表示”)和范围限制。

                  • 1