C语言中的无符号扩展和带符号扩展
(2012-03-31 15:05:05)
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=(unsigned char)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 0000。ucb类型为nsigned
char,无符号,二进制是1000 0000,扩展成unsigned short时,无符号扩展,所以补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
0000,ucb先强制转换为char,然后再转为unsigned short,此时也要带符号扩展,所以也是1111 1111 1000
0000,两数相加,得到 1 1111 1111 0000 0000 ,所以结果为0xff00。
分享:
喜欢
0
赠金笔
加载中,请稍候......
评论加载中,请稍候...
发评论
登录名: 密码: 找回密码 注册记住登录状态
昵 称:
评论并转载此博文
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。