我是 C 语言编程的新手,我正在为我的 MCU 开发固件应用程序。当我使用 KEIL 编译器(Big Endian)时,此方法工作正常,但当我切换到 SDCC 编译器(Little Endian)时,它无法正常工作。有人可以解释我做错了什么吗???
目标设备是基于 8051 架构的 Silicon Labs C8051F320。
unsigned **int** MotorSteps = 0; //"Global" variables
unsigned **int** MotorSpeed = 0;
bit RampUp()
{
float t = 0;
t = MotorSteps;
if ( t < 51 )
{
t = (1-((50 - t)/50))*15;
t = (t * t);
MotorSpeed = 100 + t;
return 0;
}
else return 1;
}
添加: 首先,我现在将 MotorSteps 和 MotorSpeed 更改为unsigned ints。 在我的调试器中,出于某种原因,如果我在函数 MotorSteps = 00 的第一个入口处的 if 语句行设置断点,那么 t 也应该被分配给 0,但调试器显示 t=0.031497(十进制).如果我将调试器切换为以十六进制显示,则 t = 0x3d010300。就像 t 永远不会被分配...
最佳答案
如果 MotorSteps = 49 那么
(50 - 49) / 50 = 0.02
下一步
(1 - 0.02) = 0.98
和
0.98 * 15 = 14.7
对该值求平方会将 t 设置为
t = 14.7 * 14.7 = 216.09
最后,从 float 到 unsigned char 的隐式转换溢出了 MotorSpeed 变量:
MotorSpeed = 100 + 216.09...// Implicitly converts the float t to an unsigned char of 216
100 + 216 = 316 的总和当然会溢出一个 unsigned char,最终得到 316-256 = 60。
无论编译器如何,这都可能是不需要的行为。
关于c - 使用 SDCC (Little Endian) 编译器时这个算法有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2374367/