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

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

这给出了heading=24464的结果,这不是我所期望的。
我试着用一个长的包含90000的零件替换90000,结果得到了预期的结果。似乎写入数字90000会导致某种溢出错误(90000-256^2=24464)。这很奇怪,因为long应该包含“从-2147483648到2147483647的整数”。我需要把它投出来吗?我不熟悉C语言,有人能解释一下这种行为吗?谢谢!

最佳答案

这是3.X的一个已知问题,以前已针对4.X进行了修复,并在4.X的当前公开发行版中得到解决。但是,3.X有一个解决方法。
使用您提供的代码,编译器输出仅通过执行整数运算来截断结果。这是一个以前发现的bug,后来修复了,但仍然存在于旧版本…输出如下:

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”实际上是短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'

10-06 02:07