0

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

我的变量定义如下:

static unsigned long actual_value;
static unsigned long incoming;
static unsigned long outgoing;

我在while循环中做的操作是:

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

问题出在哪里?

提前致谢。

4

3 回答 3

2

根据您对我的评论的回复 -outgoing - incoming小于1000,结果(outgoing - incoming) / 1000将始终为 0。

解决方案取决于您需要什么。如果您想从除法中获得真正的价值,请执行以下操作:

( outgoing - incoming ) / 1000.0

这与

( outgoing - incoming ) / 1000.

那么你会得到一个介于 0 和 1 之间的浮点数。

但是你想达到什么目的?如果( outgoing - incoming )is always< 1000和 not ,此代码将始终按原样0减少actual_valueby的值。当且仅当为 0 时,则不会改变。这是你需要的吗?1actual_valueunsigned longoutgoing - incomingactual_value


根据下面的评论,您需要一个floatordouble类型 for actual_value。然后,使用actual_value -= ( outgoing - incoming ) / 1000.;

如果要将最接近的整数值打印到actual_value,则需要

printf( "%ul\n", (unsigned long)( actual_value + .5 ) );
于 2013-02-08T10:03:08.497 回答
1

如果(outgoing - incoming)小于 1000,那么您0每次都减去,(outgoing - incoming) / 1000评估结果为0

于 2013-02-08T09:57:14.243 回答
1

您可以忘记static,它根本不影响算术结果,它仅处理变量的存储细节。

这听起来像是整数算术的问题......对我来说是整数。

减少 0.1 有效,因为这会导致舍入对您有利(增加不起作用)。

但是您的表达式(outgoing - incoming) / 1000integer,并且可能评估为 0。

此外,您应该像这样编写第一个表达式:

actual_value -= (outgoing - incoming) / 1000;

它更清楚。当然,使用调试器进行调试以查看发生了什么也很简单。

于 2013-02-08T10:00:06.660 回答