有符号数与无符号数混合运算时,把有符号数转化为无符号数,再合并运算,得到的结果是无符号数。
tips: 同一数字的无符号表示与补码表示相加的结果为2^n,其中n是这个数字的位数。
注意,下面这段代码并不是(-100+1)再转换成无符号数,而是把-100看成无符号数后再与1相加。
#include <stdio.h>
#include <math.h>
int main()
{
int x=-100;
unsigned y=1;
printf("x+y=%d(有符号)\n",x+y);
printf("x+y=%u(无符号)",x+y);
return 0;
}
结果如下
这个例子中我们也发现,printf函数可以根据输出格式控制符的不同来决定输出的是有符号数还是无符号数。
下面这段代码体现了有符号数与无符号数相加时产生溢出的情况。
#include <stdio.h>
#include <math.h>
int main()
{
int x=-1;
unsigned y=16;
printf("x+y=%d(有符号)\n",x+y);
printf("x+y=%u(无符号)",x+y);
return 0;
}
-1=0xFFFFFFFF(此时看作是无符号数)
0xFFFFFFFF+16向上溢出,结果为15(而不是一个绝对值很大的负数!)
下面这段代码说明,如果是char等比int小的类型,运算时都会转换成int运算。特别地,char为符号扩展,unsigned char为逻辑扩展。
#include <stdio.h>
#include <math.h>
int main()
{
char x=-2;
unsigned char y=-1;
printf("x+y=%d(有符号)\n",x+y);
printf("x+y=%u(无符号)",x+y);
return 0;
}