这是我在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,有人能解释一下这种行为吗?谢谢!
发布于 2015-01-14 21:08:48
这是一个已知的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将常量视为“浮点”,编译器将生成不会截断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'发布于 2015-01-14 01:07:32
试着使90000长一点,即:90000L.
long heading;
task main()
{
long num = 0;
heading = num + 90000L;
}https://stackoverflow.com/questions/27934271
复制相似问题