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

来源:互联网 发布:java基础知识大全 编辑:程序博客网 时间:2024/05/16 12:38

先上程序

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的一个验证。。。。。



1 0