关于C语言运算的自动提权及类型转换的问题

先上程序

	int16_t Test1,Test2,Test3,Test4;
	uint32_t uTest = 0;
	
	Test1 =  (uTest-4760);

	Test2 =  (uTest-4760)/10;

	uTest = (uint32_t)(uTest-4760);

	Test3 = uTest/10;

	Test4 = 0;

这段程序的计算结果是



下面解释一下为什么会出现错误的结果:


1,Test1 =  (uTest-4760);的计算结果是-4760正确的,,,这是运算完之后直接赋值给了一个可以接收此负值的一个类型,没有出现问题


2,Test2 =  (uTest-4760)/10;这个计算结果就是-26691错误的,因为计算完 -4760后还有一个除法运算,这是就需要一个变量类型。C语言把-4760自动提升为参与运算的最高级别的数据类型,也就是uTest所属的unsigned int类型,他需要把-4760强制转换成unsigned int后再去做除法运算,做完除法运算还要赋值给一个类型比自己小的short型,还要再进行一次类型转换。最后结果就成了-26691


3,uTest = (uint32_t)(uTest-4760);

Test3 = uTest/10;

这两步是我对2的一个验证。。。。。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值