我有两个静态无符号长变量之间的减法问题。
我的变量定义如下:
static unsigned long actual_value;
static unsigned long incoming;
static unsigned long outgoing;
我在一段时间内做的操作是:
actual_value = actual_value - (outgoing - incoming) / 1000;
其中“传出”总是>而不是“传入”。 问题是我的actual_value在每次迭代时都不会改变。 我永远不会在while循环的任何其他点修改“actual_value”的值,所以问题出在这里。
事实上,如果我尝试将该等式替换为:
actual_value = actual_value - 1;
在每次迭代时,该值减1。
但是,如果我改为:
actual_value = actual_value - 0.1;
在每次迭代时,该值减少1。 所以我想我还没有完全理解静态无符号变量是如何工作的。
问题出在哪里?
提前致谢。
答案 0 :(得分:2)
根据您对我的评论的回复 - 当outgoing - incoming
小于1000
时,(outgoing - incoming) / 1000
的结果将始终为0.
解决方案取决于您的需求。如果你想从分部获得真正的价值,那么就这样做:
( outgoing - incoming ) / 1000.0
与
相同( outgoing - incoming ) / 1000.
然后你会得到一个0到1之间的浮点数。
但是你想要实现什么?如果( outgoing - incoming )
始终为< 1000
而不是0
,则此代码将始终将actual_value
的值减少1
,因为actual_value
为{{} 1}}。当且仅当unsigned long
为0时,outgoing - incoming
将不会更改。这是你需要的吗?
根据以下评论,actual_value
需要float
或double
类型。然后,使用actual_value
如果要将最接近的整数值打印到actual_value -= ( outgoing - incoming ) / 1000.;
,则需要
actual_value
答案 1 :(得分:1)
如果(outgoing - incoming)
小于1000,那么您每次都会减去0
,因为(outgoing - incoming) / 1000
将评估为0
。
答案 2 :(得分:1)
您可以忘记static
,它根本不会影响算术结果,它只会处理变量的存储细节。
对于我来说,这听起来像整数运算的问题是...整数。
减少0.1的工作,因为这会导致舍入对你有利(递增不起作用)。
但你的表达式(outgoing - incoming) / 1000
是整数,可能会重新评估为0.
另外,你应该写第一个表达式:
actual_value -= (outgoing - incoming) / 1000;
更清楚。当然,使用调试器进行调试以查看发生的情况也是微不足道的。