2012年软考程序员辅导:C语言中无符号扩展和带符号扩展

来源:软件水平考试    发布时间:2012-11-05    软件水平考试视频    评论

  程序员C语言中,当不同类型的数据进行运算的时候,就会发生强制或隐式类型转换,通常是低精度的数据类型扩展到高精度的。有些时候,低精度的位数比较少,扩展到高精度的时候,就要在前面补充一些位。那么这些位是补0还是补1呢?这就涉及到无符号扩展和带符号扩展。

  扩展的原则是:1.有符号的数据类型,在向高精度扩展时,总是带符号扩展

  2.无符号的数据类型,在向高精度扩展时,总是无符号扩展

  怎么理解呢?首先来看一道题目,按此题目讲解完你就明白了!

  charca=128;

  unsignedcharucb=128;

  unsignedshortusc=0;

  1)usc=ca+ucb;

  printf("%x",usc);

  2)usc=ca+(unsignedshort)ucb;

  printf("%x",usc);

  3)usc=(unsignedchar)ca+ucb;

  printf("%x",usc);

  4)usc=ca+(char)ucb;

  printf("%x",usc);

  问,在1、2、3、4这4种情况下分别输出什么?

  分析:

  1)对于char类型,有符号,128已经溢出了,其二进制是10000000,第一位会被当成符号位,也是就是说此时它是负数了,它扩展成unsignedshort时,带符号位扩展,符号位为1,所以在前方补1,结果是111111111000000.ucb类型为nsignedchar,无符号,二进制是10000000,扩展成unsignedshor,无符号扩展,所以补0,结果是0000000010000000,。相加结果为10000000000000000由于unsignedshort是二字节,舍弃最前面的1,所以得到0x0,

  2)情况和1一样,只是将ucb显示强制转换为unsignedshort,所以得到0x0,

  3)ca先强制转换为unsignedchar,仍然是10000000,注意此时转换后已经是一个无符号数,所以再往unsignedshort扩展时,为无符号扩展,结果为0000000010000000,ucb扩展后

  也是0000000010000000,相加结果为0000000100000000,所以结果为0x100

  4)ca转为unsignedshort,带符号扩展,为111111111000000,ucb先强制转换为char,然后再转为unsignedshort,此时也要带符号扩展,所以也是111111111000000,两数相加,得到11111111100000000,所以结果为0xff00

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答