20080923

本文详细介绍了整数扩展的概念,包括零扩展和符号扩展,并通过示例说明了不同类型的整数在扩展过程中的变化。此外,还展示了由于整数扩展不当可能导致的程序错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值