unsigned char m;
signed char n;
signed int p;
p=m*n;//不能正常计算
p=(signed int)n*(signed int)m;//能够正常计算
我想这个问题大家可能都遇见过。如果你没有显示定义计算过程中的数据类型,单片机在计算不同类型的数据时,会选择其中(m,n)之一作为默认的数据类型。这个“之一”是根据编译器所不同,没法知道。所以在运算过程中最好都显示定义数据类型。(signed int)n没有改变n的类型,也不会增添任何的汇编代码。
还有一点,比如两个int类型的数据相乘。signed int a;signed int ;所给的值给一个signed long c;如果直接用c=(int)a*(int)b;计算中很多情况是错误的。这是由于如果a,b比较大,在计算过程中如果超出了int的范围,就会出错。避免这一点:c=(signed long)a*(signed long)b;就可以了。
不知道你们在计算过程中遇到过什么样的问题?谈谈自己的看法