不同类型的变量相加要注意的就是整型提升,关于整型提升,已经在我的上一篇博客中介绍了,感兴趣的话可以去看一下。
看下面的例子:
#include<stdio.h>
int main()
{
char c;
unsigned char uc;
unsigned short us;
c = 128;
uc = 128;
us = uc + c;
printf("0x%x ",us);
us = (unsigned char)c + uc;
printf("0x%x ",us);
us = c + (char)uc;
printf("0x%x ",us);
return 0;
}
1.us = uc + c;
c可以表示为: 10000000
整型提升以后为:11111111 11111111 11111111 10000000
因为c是singned数,所以整型提升的时候前面补符号位;
uc可以表示为:00000000 10000000
整型提升以后为:00000000 00000000 00000000 10000000
因为uc是unsigned数,所以提升的时候前面补0;
两折相加,赋值给us
输出us为0x0
2.us = (unsigned char)c + uc;
c可以表示为: 10000000
整型提升以后为:00000000 00000000 00000000 10000000
因为c是unsigned数,所以整型提升的时候前面补0
uc可以表示为:00000000 10000000
整型提升以后为:00000000 00000000 00000000 10000000
因为uc是unsigned数,所以提升的时候前面补0;
两折相加,赋值给us
输出us为0x100
3.us = c + (char)uc;
c可以表示为: 10000000
整型提升以后为:11111111 11111111 11111111 10000000
因为c是signed数,所以整型提升的时候前面补符号位
uc可以表示为:00000000 10000000
整型提升以后为:11111111 11111111 11111111 10000000
因为uc是signed数,所以提升的时候前面补符号位;
两折相加,赋值给us
输出us为0xff00