在 RobotC 中添加多头时的奇怪行为

Strange behavior when adding longs in RobotC

这是我在使用 RobotC 3.62 时遇到的问题示例:

long heading;
task main()
{
    long num = 0;
    heading=num+90000;
}

这给出了 heading=24464 的结果,这不是我所期望的。

我尝试用包含 90000 的 long 替换 90000 部分,它给出了预期的结果。似乎写入数字 90000 会导致某种溢出错误 (90000-256^2=24464)。这很奇怪,因为 long 应该持有 "A whole number ranging from -2,147,483,648 to 2,147,483,647" 。我需要以某种方式投射它吗?我不熟悉 C,有人可以解释这种行为吗?谢谢!

尝试使 90000 变长,即:90000L.

long heading;
task main()
{
    long num = 0;
    heading = num + 90000L;
}

这是 3.X 的一个已知问题,之前已在 4.X 中修复,并在 4.X 的当前 public 版本中得到解决。但是,3.x 有一个解决方法。

使用您提供的代码,编译器输出仅通过整数运算截断结果。这是一个以前发现的错误,后来修复了,但在旧版本中仍然存在...这是输出:

long num = 0;
0025: CB000000 num:S00(slong) = 0 // long/float
heading = num + 90000;
0029: BD0800002B000000905F heading:G00(slong) = num:S00(slong) + 90000

作为 3.X 中的解决方法,如果您通过指定 90000.0 将常量视为 "float",编译器将生成不会截断 long 的代码,因为它会做 32 位级别的数学运算(在 NXT 上,"int" 实际上是短整数,因此被截断)

long num = 0;
0025: CB000000 num:S00(slong) = 0 // long/float
heading = num + 90000.0;
0029: AD2D04002B0000 S04(float) = num:S00(slong) // Store in temp variable :: Convert 'long' to 'float'
0030: 902D040000C8AF47 S04(float) += 90000 // Perform <op> on temp variable :: float
0038: 8C0800002D0400 heading:G00(slong) = S04(float) // Convert 'float' to 'long'