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

先上程序

  1. int16_t Test1,Test2,Test3,Test4;  
  2. uint32_t uTest = 0;  
  3.   
  4. Test1 =  (uTest-4760);  
  5.   
  6. Test2 =  (uTest-4760)/10;  
  7.   
  8. uTest = (uint32_t)(uTest-4760);  
  9.   
  10. Test3 = uTest/10;  
  11.   
  12. 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的一个验证。

永不止步步 发表于02-08 10:11 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:308617个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号