先看代码:
#include <stdlib.h> #include <stdio.h> int main() { int a = -6; unsigned int b = 4; if(a+b > 0) printf("a+b>0\n");//这句话被打印 else printf("a+b<0\n"); int z = a+b; if(z > 0) printf("z>0\n"); else printf("z<0\n");//这句话被打印 unsigned int uni=a+b; int i = a+b; printf("uni=%u, i=%d\n", uni, i);//uni=4294967294, i=-2 printf("uni=%d, i=%d\n", uni, i);//uni=-2, i=-2 printf("uni=%u, i=%u\n", uni, i);//uni=4294967294, i=4294967294 if(i==uni){ printf("equal\n");//这句话被打印 }else{ printf("not equal\n"); } }
下面解释一下原因:当int和unsigned in相加时,要将int转化为unsigned int,而int小于0,所以它的最高位是符号位,为1,所以转化的结果是一个很大的正数,在第一个if语句中,是两个“正数”相加,结果自然就大于0了。而在z = a+b这一句时,它把a+b的结果看做一个int类型,而a+b最高位为1,所以z是一个负数,所以打印的是第二个语句。
参考了这篇文章:http://blog.csdn.net/thefutureisour/article/details/8147277
时间: 2024-11-09 18:18:44