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变量吗?@user2053842actual_value
不能存储4999.95
和4999.49
这样的值,因为它是无符号int
。这意味着整数。你需要使用float
或double
来代替。你在哪里打印值?立即打印在操作完成后,使用一个printf(“%lu\n”,实际值);
。好的,谢谢,我不知道unsigned long自动意味着