现在的位置: 首页 > 综合 > 正文

C语言中的无符号扩展和带符号扩展

2013年08月19日 ⁄ 综合 ⁄ 共 1065字 ⁄ 字号 评论关闭

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

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

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

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

char   ca=128;

unsigned  char  ucb=128;

unsigned  short   usc=0;

1)usc=ca + ucb; 

 printf("%x",usc);

2)usc=ca +(unsigned  short)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已经溢出了,其二进制是 1000 0000,第一位会被当成符号位,也是就是说此时它是负数了,它扩展成unsigned short时,带符号位扩展,符号位为1,所以在前方补1,结果是
1111 1111 1000 000。
 ucb类型为nsigned char,无符号,二进制是1000
0000,扩展成
unsigned shor,无符号扩展,所以补0,结果是0000 0000 1000 0000,。相加结果为 1 0000 0000 0000 0000 由于unsigned
short是二字节,舍弃最前面的1,
所以得到0x0,

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

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

也是0000
0000 1000 0000,相加结果为 0000 0001 0000 0000,
所以结果为0x100

4)ca转为unsigned
short,带符号扩展,为
1111 1111 1000 000,ucb先强制转换为char,然后再转为unsigned short,此时也要带符号扩展,所以也是1111
1111 1000 000,两数相加,得到 1 1111 1111 0000 0000 ,所以结果为0xff00

抱歉!评论已关闭.