20080923

来源:互联网 发布:淘宝课程学习 编辑:程序博客网 时间:2024/05/16 10:55

1. 整数的扩展

当我们需要将一个较小的数据类型转换成一个较大的数据类型时,对于无符号数而言,我们只需要简单的进行零扩展(zero extension)就可,即只需要将要扩展的位填0就好了;而对于有符号数而言,我们就必须进行符号扩展了(sign extension)了,即将需要扩展的位全部填为当前的符号位。

eg. unsigned: [ x1 x2 x3 ... xn ] -> [ 0 0 0 ... 0 0 ... x1 x2 x3 ... xn ]

      signed:   [ x1 x2 x3 ... xn ] -> [ x1 x1 x1 ... x1 ... x1 x2 x3 ... xn ]

至于有符号数的扩展的证明,可参见二进制的表示方式和数学归纳法。

因此,我们要格外小心这些整数扩展而产生的问题,例如:

eg1.

  1. short sx = val;                        /*  -12345  ---  0xCFC7 */
  2. unsigned short usx = sx;       /*  53191    ---  0xCFC7 */
  3. int x = sx;                              /*  -12345   ---  0xFFFFCFC7 */
  4. unsigned ux = usx;               /*    53191   --- 0x0000CFC7 */
  5. unsigned uy = x;                  /*    4294954951   ---  0xFFFFCFC7  */

eg2.

  1. /* WARNING: This is buggy code */
  2. float sum_elements( float a[], unsigned length )
  3. {
  4.        int i;
  5.        float result = 0;
  6.        for ( i =  0; i <= length - 1; i++ )    // error: 0U - 1 = max(32bit)
  7.              result += a[i];
  8.        return result;
  9. }

P54

原创粉丝点击