这道题你会做吗

昨天在看程序员面试宝典这本书时,无意中看到了这么一道题:题目中的程序大概是这样的:
#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.csdn.net/zhuimengzh/article/details/6728492
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值