前言
C语言中,当不同类型的数据进行运算时,会发生强制或隐式类型的转换,通常是低精度的数据类型扩展到高精度类型。
这就得考虑扩展时是补0还是补1了。
扩展原则
1.有符号的数据类型,在向高精度扩展时,总是带符号扩展
2.无符号的数据类型,在向高精度扩展时,总是无符号扩展
例子
#include <cstdio>
#include<cstdlib>
int main(){
char ca=128;
unsigned char ucb=128;
unsigned short usc=0;
//①
usc=ca+ucb;
printf("%x\n",usc);
//②
usc=ca+(unsigned short)ucb;
printf("%x\n",usc);
//③
usc=(unsigned char)ca+ucb;
printf("%x\n",usc);
//④
usc=ca+(char)ucb;
printf("%x\n",usc);
system("pause");
}
①对于char类型ca,有符号,且 \(128_{10}=1000\quad0000_2\) 溢出,第一位为符号位,它扩展成unsigned short时,带符号位扩展,符号位为1,故在前面补1,结果是1111 1111 1000 0000。而对于unsigned char 类型的ucb,二进制是1000 0000,无符号,扩展成unsigned short时往前补0,结果是0000 0000 1000 0000,相加结果为1 0000 0000 0000 0000。由于unsigned short是二字节,舍弃最前面的1,所以得到0x0。
②情况和1一样,只是将ucb显示强制转换为unsignedshort,所以得到0x0。
③ca先强制转换为unsigned char,仍然是1000 0000,注意此时转换后已经是一个无符号数
,所以再往unsigned short扩展时,为无符号扩展,结果为0000 0000 1000 0000,ucb扩展后也是0000 0000 1000 0000,相加结果为0000 0001 0000 0000,所以结果为0x100。
④ca转为unsigned short,带符号扩展,为1111 1111 1000 0000,ucb先强制转换为char,然后再转为unsigned short,此时也要带符号扩展,所以也是1111 1111 1000 0000,两数相加,得到1 1111 1111 0000 0000,所以结果为0xff00。