赞
踩
一、扩展一个数字的位表示
一种常见的运算是在不同字长的整数之间转换,例如,从一个较小的数据类型转换到一个较大的数据类型。
将一个无符号数转换为一个更大的数据类型,只需要简单地在表示的开头添加 0,这种运算称为零扩展。
将一个补码数字转换为更大的数据类型要执行符合扩展,规则是在表示中添加最高有效位的值的副本。如果原始的位表示为,那么扩展后的位表示为。
下面证明符号扩展是正确的,即证明下式:
表达式的左边增加了k位的副本。采用的是数学归纳法,即证明符号扩展一位保持数值不变,那符号扩展任何位都保持这种属性。
根据定义展开,
二、截断数字
例如,在一台32位机上,将 int类型强制转换为short时,就会将32位的int截断为16位的,将一个w位的数截断为一个k位数字时,将会丢弃高w-k位,得到一个位向量,截断一个数字可能会改变一个它的值,这是溢出的一种形式。
对于一个无符号数 x,截断它到k位,相当于计算,通过下式计算得到:
对于一个补码数字 x, 相似的推理可知道,
,也就是, 能都被位级表示为 ,不过,一般而言,这个被截断的数字被视为有符号的,这将得到数值 。
参考:深入理解计算机系统(第二版)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。