云计算百科
云计算领域专业知识百科平台

(学习笔记)2.2 整数表示(2.2.7 截断数字)

文章目录

  • 线索栏
  • 笔记栏
    • 1. 截断的基本概念与示例
    • 2. 截断无符号数的原理与公式
      • 1)原理
      • 2)数学直觉
      • 3)公式(等式2.9)
      • 4)推导过程
    • 3. 截断补码数的原理与公式
      • 1)原理
      • 2)公式(等式2.10)
      • 3)推导过程
    • 4.练习题2.24
  • 总结栏

线索栏

  • 截断操作的定义是什么?它为何是溢出的一种形式?
  • 截断一个 w 位无符号数​ 到 k 位​ 的数学原理和结果是什么?(公式)
  • 截断一个 w位补码数​ 到 k 位​ 的数学原理和结果是什么?(公式)它与无符号数截断有何联系?
  • 练习题2.24中的表格应如何填写?如何应用相应的原理(公式)来解释?

  • 笔记栏

    1. 截断的基本概念与示例

    (1)定义:当用位数更少(k位)的数据类型来表示一个位数较多(w位, k < w)的数值时,会发生截断。具体操作是直接丢弃原始数据的高 w-k位。 (2)本质:这是一种不改变位宽,而强行压缩表示范围的溢出。 (3)代码示例:

    int x = 53191; // 32位补码值
    short sx = (short)x; // 截断为16位,位模式为0xCFC7
    // sx现在被解释为 -12345(补码)
    int y = sx; // 通过符号扩展恢复为32位,y = -12345

    2. 截断无符号数的原理与公式

    1)原理

    截断后的值 x′等于原始值 x对 2k取模。

    2)数学直觉

    所有被丢弃的高位权重都是 2k的倍数(即形如 2i,i≥k),因此在模 2k运算下,它们的贡献均为0。

    3)公式(等式2.9)

    B

    2

    U

    k

    (

    [

    x

    k

    1

    ,


    ,

    x

    0

    ]

    )

    =

    B

    2

    U

    w

    (

    [

    x

    w

    1

    ,


    ,

    x

    0

    ]

    )

    m

    o

    d

    2

    k

    B2U_k([x_{k-1}, \\cdots, x_0]) = B2U_w([x_{w-1}, \\cdots, x_0]) \\bmod 2^k

    B2Uk([xk1,,x0])=B2Uw([xw1,,x0])mod2k

    4)推导过程

    B

    2

    U

    w

    (

    x

    )

    m

    o

    d

    2

    k

    B2U_w(\\vec{x})\\bmod 2^k

    B2Uw(x

    )mod2k

    =

    [

    i

    =

    0

    w

    1

    x

    i

    2

    i

    ]

    m

    o

    d

    2

    k

    =\\left[\\sum_{i=0}^{w-1} x_i\\cdot 2^i\\right]\\bmod 2^k

    =[i=0w1xi2i]mod2k

    =

    [

    i

    =

    0

    k

    1

    x

    i

    2

    i

    ]

    m

    o

    d

    2

    k

    (

    因为当 

    i

    k

    时, 

    2

    i

    m

    o

    d

    2

    k

    =

    0

    )

    =\\left[\\sum_{i=0}^{k-1} x_i\\cdot 2^i\\right]\\bmod 2^k\\quad(\\text{因为当 }i\\geq k\\text{时, }2^i\\bmod 2^k=0)

    =[i=0k1xi2i]mod2k(因为当 ik时, 2imod2k=0)

    =

    i

    =

    0

    k

    1

    x

    i

    2

    i

    =\\sum_{i=0}^{k-1} x_i\\cdot 2^i

    =i=0k1xi2i

    =

    B

    2

    U

    k

    (

    [

    x

    k

    1

    ,


    ,

    x

    0

    ]

    )

    =B2U_k([x_{k-1},\\cdots,x_0])

    =B2Uk([xk1,,x0])

    3. 截断补码数的原理与公式

    1)原理

    补码数的截断是两个步骤的组合: (1)与无符号数一样截断:计算原始值(无论被解释为有符号还是无符号)对2k取模,得到一个范围在 [0,2k−1]内的中间无符号数。这个数的位模式是保留的低 k位。 (2)重新解释为补码:将得到的这个 k位无符号数,通过函数

    U

    2

    T

    k

    U2T_k

    U2Tk​重新解释为k位补码数(即判断其最高位

    x

    k

    1

    x_{k−1}

    xk1 ​,若为1,则值 = 中间值 – 2k)。

    2)公式(等式2.10)

    B

    2

    T

    k

    (

    [

    x

    k

    1

    ,


    ,

    x

    0

    ]

    )

    =

    U

    2

    T

    k

    (

    B

    2

    U

    w

    (

    [

    x

    w

    1

    ,


    ,

    x

    0

    ]

    )

    m

    o

    d

    2

    k

    )

    B2T_k([x_{k-1}, \\cdots, x_0]) = U2T_k \\big( B2U_w([x_{w-1}, \\cdots, x_0]) \\bmod 2^k \\big)

    B2Tk([xk1,,x0])=U2Tk(B2Uw([xw1,,x0])mod2k)

    3)推导过程

    首先通过推导证明

    B

    2

    U

    w

    (

    x

    )

    m

    o

    d

    2

    k

    =

    B

    2

    U

    k

    (

    [

    x

    k

    1

    ,

    ,

    x

    0

    ]

    )

    B2U_w ​(\\vec{x})mod2^k=B2U_k ​([x_{k−1} ​,⋯,x_0 ​])

    B2Uw(x

    )mod2k=B2Uk([xk1,,x0])。然后,由于我们需要一个补码解释的结果,只需要将这个无符号结果

    U

    2

    T

    k

    U2T_k

    U2Tk ​即可:

    x

    =

    U

    2

    T

    k

    (

    x

    m

    o

    d

    2

    k

    )

    x′=U2T_k ​(xmod2^k)

    x=U2Tk(xmod2k)

    4.练习题2.24

    在这里插入图片描述

  • 无符号列:直接应用公式(2.9)。例如 9 mod 8 = 1。
  • 补码列:应用公式(2.10),分两步。 (1)将原始值视为无符号数(或直接取其位向量),计算 原始值mod8。例如,0xB(无论解释为11还是-5)的位模式1011,1011表示的无符号数是11,11 mod 8 = 3。 (2)将结果(3)解释为3位补码。3的3位二进制为011,最高位为0,所以值为正3。 在这里插入图片描述
  • 总结栏

    本节核心是理解整数截断的原理与数学本质。

  • 操作定义:丢弃高位,强制减少表示位宽。这是一种溢出。
  • 无符号数截断:结果是原始值对

    2

    k

    2^k

    2k取模(

    m

    o

    d

    mod

    mod)。数学上等价于只保留低k位。 公式:

    x

    =

    x

    m

    o

    d

    2

    k

    x′=xmod2^k

    x=xmod2k

  • 补码数截断:过程分为两步。首先,像无符号数一样取模,得到一个中间无符号值。然后,关键的一步是将这个中间值重新解释(应用

    U

    2

    T

    k

    U2T_k

    U2Tk​函数)为补码数。这可能导致有符号解释下的值发生“符号改变”(如一个负数截断后可能变成正数,如补码-5(0xB)截断后变为3)。 公式:

    x

    =

    U

    2

    T

    k

    (

    x

    m

    o

    d

    2

    k

    )

    x′=U2T_k ​(xmod2^k)

    x=U2Tk(xmod2k)

  • 核心联系:截断操作直接作用于位模式本身。对于无符号数,截断后的位模式直接按无解释解读。对于补码数,同一套截断后的位模式,需要按补码规则重新解读。
  • 关键启示:截断会丢失信息,并可能完全改变一个数的语义(尤其对于补码数)。在涉及强制类型转换(大转小)的编程中,必须清楚其截断效应,尤其是符号位被丢弃后可能引发的逻辑错误。
  • 赞(0)
    未经允许不得转载:网硕互联帮助中心 » (学习笔记)2.2 整数表示(2.2.7 截断数字)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!