c - 使用 SDCC (Little Endian) 编译器时这个算法有什么问题?

标签 c math 8051 endianness sdcc

我是 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/

相关文章:

c - 在哪里可以找到 off_t 类型的完整定义?

枚举中的常量在定义中未见

c - 在 C 中打印和使用数组元素

java - 当端点完全相同时,线相交算法返回 false?

java - java中的简单图形

assembly - 如果两个端口位相等、大于或小于彼此,如何比较它们?

c - 如何在c中声明大小为n x n的内存。

c - 文件扫描 C 中的二维数组

python - 如何对字符串进行数学运算?

c - 为什么我的位不左移?