gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:31:55 25 4
gpt4 key购买 nike

这是我在使用 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 integer number ranges from -2,147,483,648 to 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 将常量视为“ 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'

关于c - 在 RobotC 中添加多头时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27934271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com