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类型的。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
leafstamen
1楼-- · 2020-02-06 10:58
J*100是8位。
TBG3
2楼-- · 2020-02-06 14:18
 精彩回答 2  元偷偷看……
techbaby
3楼-- · 2020-02-06 19:16
觉得不对,加个强制转换不就得了!
I += (unsigned long)J*100;
zouzhichao
4楼-- · 2020-02-06 21:25
J=1000?uchar哦
flamma
5楼-- · 2020-02-07 03:13
unsigned char J = 1000; 这里1000就被截了

I += J*100; 这里会先转换成unsigned char,这一步就会发生截位,然后在转换成unsigned long。
反过来写 I+= 100*J 应该就不会。
eduhf_123
6楼-- · 2020-02-07 05:23
J = 1000会被截断成J = 232,因为只能保留最低8位。

计算表达式J*100时存在整型提升,将J扩充到8*sizeof(unsigned int)位,然后再计算与100的乘积,结果为23200,因为没有超过unsigned int的取值范围,所以没有发生截断损失。

在计算+=时,先将上述的临时结果23200扩充到8*sizeof(I)位,然后计算加法。

综上,XC16没有错。

一周热门 更多>