。扩展位表示
当把一个较小长度的整数数据类型强制转换成较大长度的整数数据类型时,编译器扩展整数数据的位表示。
假设要把一个w位的整数扩展成w + k位。
无符号数的扩展直接在扩展后的高K位填0,低位保持原先的状态。这种扩展称作“零扩展”
很容易可以看出根据C中的整型(1) 的公式1求出的扩展后的数值不变。
对有符号数进行的扩展称作“符号扩展”,具体规则是扩展出的k位都设置成扩展前的符号位数值。
有符号所表示的正数,扩展的k位都填0,根据C中的整型(1) 的公式2可以很容易看出扩展后的数值是正确的。
对于有符号所表示的负数,扩展的k位都填上符号位1,也许不能很直接地看出扩展后的结果是否正确。
书上用归纳法进行了证明,只要证明扩展1位后数值保持不变,那么扩展k位也有同样的结果:
扩展一位后,仍然用C中的整型(1) 公式2进行计算,最高位下标为w,正好是公式3的表达式。所以扩展后表示的数值是一样的。
其实可以用一个比较形象的方法来理解负数的这种扩展:
我们把符号位表示的2^(w-1)这个数值看成一个水桶的容积,把w-1位后的位表示的和看成水桶中现有的水的体积。那么桶里剩下的容积就是这个整个位模式所表示的负数。先看看扩展一位后会发生什么变化:扩展的位成为最高位,下标w,现在水桶的容积是2^w,原来的符号位紧跟在它后面,成了水桶中水的体积的一部分,代表的体积是扩展前水桶的体积。也就是说扩展一位后等同于这样的行为:找到一个容积是原来容积2倍的桶,装上原来水桶容积等量的水(就是w-1位所代表的水体积),再把旧水桶原有的水往里面倒。很明显剩下的空间和原来水桶所剩下的空间一样大小==>表示的负数值和原来所表示的一样==>扩展1位后的结果不变。再用归纳法,就可以得出扩展k位后的结果也是一样的^_^
。截断位表示
当把一个较长的整型数据类型强制转换成较短的整型数据类型,就发生位截断——把高位截断。
截断高k位,那么剩下的低w-k位的位模式不变。