在RobotC中添加long时的奇怪行为

时间:2015-01-14 01:04:33

标签: c robot nxt mindstorms

这是我遇到的RobotC 3.62问题的一个例子:

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

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

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

2 个答案:

答案 0 :(得分:1)

尝试将90000设为长,即:90000L.

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

答案 1 :(得分:1)

这是3.X的已知问题,之前已针对4.X进行了修复,并在4.X的当前公开发行版中得到了解决。但是,有一个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中的变通方法,如果将常量视为" float"通过指定90000.0,编译器将生成不会截断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'