2013-02-08 25 views
0

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

我的变量定义如下:

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 - 0.1; 
:1。

actual_value = actual_value - 1; 

正确地在每次迭代值减小但是,如果我有改变

再次在每次迭代的值减少1. 所以我想我还没有完全理解静态无符号变量是如何工作的。

问题在哪里?

在此先感谢。

+3

是'传出 - incoming'不到'1000'? –

+0

是的。它是一个小的无符号长整型值(总是小于几十)。 – aliants

回答

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_valueunsigned long。当且仅当outgoing - incoming为0时,actual_value不会被改变。这是你需要的吗?


基于下面的评论,你需要一个floatdouble类型actual_value。然后,用actual_value -= (outgoing - incoming)/1000.;

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

printf("%ul\n", (unsigned long)(actual_value + .5)); 
+0

actual_value应该打印当前值和另一个小数值(如0.02,0.043等)之间的相减的最接近的整数。 – aliants

+0

@ user2053842“最接近的整数”是什么意思?因为在这种情况下'actual_value = actual_value - 0.043'将与'actual_value = actual_value - 1'相同。 –

+0

我的'actual_value'从5000开始。如果在第一次迭代中我减去0.05,它的值将是4999.95,所以我希望它打印5000.只有当它的值将达到4999.49我想它打印4999. 所以我应该将'actual_value'定义为double或float变量? – aliants

1

如果(outgoing - incoming)小于1000,则每次减去0,因为(outgoing - incoming)/1000将评估为0

1

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

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

减少0.1的作品,因为这会导致四舍五入对你有利(增加不起作用)。

但你的表达(outgoing - incoming)/1000整数,大概evalutating 0

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

actual_value -= (outgoing - incoming)/1000; 

显得更为清晰。当然,使用调试器进行调试以查看发生的情况也是微不足道的。根据您的回应哟我的评论