在 RobotC 中添加长整型时的奇怪行为

问题描述 投票:0回答:2

这是我在使用 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 不熟悉,有人可以解释一下这种行为吗?谢谢!

c robotics lego-mindstorms nxt
2个回答
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 中的解决方法,如果通过指定

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'

1
投票

尝试将

90000
写成长形,即:
90000L.

long heading;
task main()
{
    long num = 0;
    heading = num + 90000L;
}
© www.soinside.com 2019 - 2024. All rights reserved.