这是我在使用 RobotC 3.62 时遇到的问题的示例:
long heading;
task main()
{
long num = 0;
heading=num+90000;
}
这给出了
heading=24464
的结果,这不是我所期望的。
我尝试将 90000 部分替换为包含 90000 的 long 部分,它给出了预期的结果。似乎写入数字 90000 会导致某种溢出错误
(90000-256^2=24464)
。这很奇怪,因为 long 应该包含“从 -2,147,483,648 到 2,147,483,647 的整数”。我需要以某种方式投射它吗?我对 C 不熟悉,有人可以解释一下这种行为吗?谢谢!
这是 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 中的解决方法,如果通过指定
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'
尝试将
90000
写成长形,即:90000L.
long heading;
task main()
{
long num = 0;
heading = num + 90000L;
}