Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 静态无符号长变量之间的减法_C - Fatal编程技术网

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

C 静态无符号长变量之间的减法,c,C,我对两个静态无符号长变量之间的减法有一个问题 我的变量定义如下: static unsigned long actual_value; static unsigned long incoming; static unsigned long outgoing; 我在while循环中执行的操作是: actual_value = actual_value - (outgoing - incoming) / 1000; 其中“传出”始终大于“传入”。 问题是我的实际_值在每次迭代中都不会改变。 我从

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

我的变量定义如下:

static unsigned long actual_value;
static unsigned long incoming;
static unsigned long outgoing;
我在while循环中执行的操作是:

actual_value = actual_value - (outgoing - incoming) / 1000;
其中“传出”始终大于“传入”。 问题是我的实际_值在每次迭代中都不会改变。 我从不在while循环的任何其他点修改“实际值”的值,所以问题就在这里

事实上,如果我试着用以下公式代替这个等式:

actual_value = actual_value - 1;
正确地说,每次迭代时,该值都会减少1

但是,如果我将其更改为:

actual_value = actual_value - 0.1;
在每次迭代中,该值再次减少1。 所以我想我还没有完全理解静态无符号变量是如何工作的

问题出在哪里


提前感谢。

如果
(传出-传入)
小于1000,则每次都要减去
0
,因为
(传出-传入)/1000
将计算为
0

如果
(传出-传入)
小于1000,则每次都要减去
0
,如
(传出-传入)/1000
将计算为
0

您可以忘记
静态
,它根本不会影响算术结果,它只处理变量的存储细节

这听起来像是整数运算的问题……嗯,对我来说是整数

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

但是您的表达式
(outing-incoming)/1000
是整数,可能会求值为0

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

actual_value -= (outgoing - incoming) / 1000;

这一点要清楚得多。当然,使用调试器进行调试以查看发生的情况也很简单。

您可以忘记
静态
,它根本不会影响算术结果,它只处理变量的存储细节

这听起来像是整数运算的问题……嗯,对我来说是整数

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

但是您的表达式
(outing-incoming)/1000
是整数,可能会求值为0

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

actual_value -= (outgoing - incoming) / 1000;

这一点要清楚得多。当然,使用调试器进行调试以查看发生了什么也不重要。

根据您的回答,我的评论-由于
传出-传入
小于
1000
(传出-传入)/1000
的结果始终为0

解决方案取决于您需要什么。如果您希望从除法中获得实际值,请执行以下操作:

( outgoing - incoming ) / 1000.0
这和

( outgoing - incoming ) / 1000.
然后得到一个浮点数,介于0和1之间

但是你想要实现什么呢?如果
(传出-传入)
总是
<1000
而不是
0
,此代码总是将
实际值
减少
1
,因为
实际值
无符号长的
。如果且仅当
传出-传入
为0,则不会更改
实际值
。这是您需要的吗


根据下面的注释,对于
actual_value
,您需要一个
float
double
类型。然后,使用
actual_value-=(传出-传入)/1000;

如果要打印与实际值最接近的整数值,则需要

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

根据您的回复,我的评论-由于
传出-传入
小于
1000
(传出-传入)/1000
的结果将始终为0

解决方案取决于您需要什么。如果您希望从除法中获得实际值,请执行以下操作:

( outgoing - incoming ) / 1000.0
这和

( outgoing - incoming ) / 1000.
然后得到一个浮点数,介于0和1之间

但是你想要实现什么呢?如果
(传出-传入)
总是
<1000
而不是
0
,此代码总是将
实际值
减少
1
,因为
实际值
无符号长的
。如果且仅当
传出-传入
为0,则不会更改
实际值
。这是您需要的吗


根据下面的注释,对于
actual_value
,您需要一个
float
double
类型。然后,使用
actual_value-=(传出-传入)/1000;

如果要打印与实际值最接近的整数值,则需要

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

传出-传入
是否小于
1000
?是。它是一个小的无符号长值(总是小于几十)。传出-传入
是否小于
1000
?是。它是一个小的无符号长值(总是小于几十).actual_value应打印其当前值与另一个小值(如0.02、0.043等)之间最接近的减法整数。@user2053842“最接近的整数”是什么意思因为在这种情况下,
actual\u value=actual\u value-0.043
actual\u value=actual\u value-1
相同。我的
actual\u value
从5000开始。如果在第一次迭代时我减去0.05,它的值将是4999.95,因此我希望它打印5000。只有当它的值达到4999.49时,我希望它打印4999。那么,我应该将
actual_value
定义为double或float变量吗?@user2053842
actual_value
不能存储
4999.95
4999.49
这样的值,因为它是
无符号int
。这意味着整数。你需要使用
float
double
来代替。你在哪里打印值?立即打印在操作完成后,使用一个
printf(“%lu\n”,实际值);
。好的,谢谢,我不知道unsigned long自动意味着