XC16理解的对? 还是我理解的对?

2020-02-06 09:59发布

最近发现一个很有趣的事情

程序如下:
{
unsigned long I;
unsigned char J = 1000;


.
.
.
I += J*100;

}

结果呢,J*100是超出了16位的数字,但是呢,I中超出16位的进位没了!

我的理解是 这条公式里面的类型转换,也就是J*100,应该是unsigned long类型的,二不应该是unsigned int类型的。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
12条回答
TBG3
2020-02-07 18:40
转一篇数据转换原则吧。

赋值运算:自动把“=”右边的表达式的类型转换成“=”右边的变量的类型,例如 int a=4.5; a的值实际是4!
混合运算:就是一个运算表达式当中包含了多个类型,这时候就需要有类型转换。当运算符两边的操作数类型不同时,其中一个操作数就要经过类型转换以和另一个操作数的类型相一致,然后才能进行运算。
变换操作数采取就高不就低的原则,即级别低的操作数先被转换成和级别高的操作数具有同一类型,然后再进行运算,结果的数据类型和级别高的操作数相同。
       高        double    ←←    float
       ↑          ↑             
       ↑         long     
       ↑          ↑
       ↑        unsigned
       ↑          ↑
       低         int      ←←    char,short
             自动转换顺序表

顺带说一句:如果等式两端都不超过int, 那么右端运算时都自动提升为int. 如果超过int, 则提升为表达式中最高级别那个变量的级别。

一周热门 更多>