昨天在看程序员面试宝典这本书时,无意中看到了这么一道题:题目中的程序大概是这样的:
看了一下,很简单的一道题嘛,答案当然是0了,一看后面的答案,竟然错了,然后继续分析,看了好久还是没看出哪错了,于是动手写了这段程序测试了一下,结果真的是0;
在算数运算中,如果涉及到无符号数与有符号数之间的操作,编译器会自动转化为无符号数来进行处理!!!
http://blog.youkuaiyun.com/zhuimengzh/article/details/6728492
#include <stdio.h>
int main(void)
{
int a = -20;
unsigned int b = 10;
char c;
(a + b > 6) ? (c = 1) : (c = 0);
return c;
}
题目要求读这段程序,给出最后的结果。
看了一下,很简单的一道题嘛,答案当然是0了,一看后面的答案,竟然错了,然后继续分析,看了好久还是没看出哪错了,于是动手写了这段程序测试了一下,结果真的是0;
注意:在测试的时候不能使用printf("%d", a+b);来查看a+b的值,因为这个%d会将其结果转换成整形输出。刚开始我就犯了这样的错误,后面就用C++中的cout又试了一下,这下结果却不是-10了,而是4294967286,看到这个结果当时就凌乱了。然后就看了一下后面的解析,才发现:unsigned int类型的数据和int类型的数据在进行运算时,会将int类型的数据转换为unsigned int类型,再进行算术运算,在该程序中,int类型的-20转换为unsigned int将是一个非常大的正整数,本身就已远大于6了,所以最后的结果应该是c=1.
最后在网上也差了一下资料,发现在C语言中还有着这样的规定:在算数运算中,如果涉及到无符号数与有符号数之间的操作,编译器会自动转化为无符号数来进行处理!!!
自己写了几个小程序测试了一下,发现也确实是这样的。
同时,在查资料的过程中,也发现了一篇关于C语言中的整数自动转换原则的文章写的不错,推荐给大家。http://blog.youkuaiyun.com/zhuimengzh/article/details/6728492