静态无符号长变量之间的减法

时间:2013-02-08 09:54:44

标签: c

我有两个静态无符号长变量之间的减法问题。

我的变量定义如下:

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。 所以我想我还没有完全理解静态无符号变量是如何工作的。

问题出在哪里?

提前致谢。

3 个答案:

答案 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需要floatdouble类型。然后,使用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;

更清楚。当然,使用调试器进行调试以查看发生的情况也是微不足道的。