首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在RobotC中添加longs时的奇怪行为

在RobotC中添加longs时的奇怪行为
EN

Stack Overflow用户
提问于 2015-01-14 01:04:32
回答 2查看 200关注 0票数 0

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

代码语言:javascript
复制
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,有人能解释一下这种行为吗?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-14 21:08:48

这是一个已知的3.x问题,以前已经修正为4.X,并在当前的公开版本4.X中得到解决,但3.X有一个解决办法。

使用您提供的代码,编译器输出将通过只执行整数运算来截断结果。这是以前发现的一个bug,后来修复了,但仍然存在于旧版本中.这是输出:

代码语言:javascript
复制
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,因此是截断)。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-01-14 01:07:32

试着使90000长一点,即:90000L.

代码语言:javascript
复制
long heading;
task main()
{
    long num = 0;
    heading = num + 90000L;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27934271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档