【问题标题】:Inequality on unsigned values无符号值的不等式
【发布时间】:2013-07-23 17:16:04
【问题描述】:

我一直想知道以下情况。

L_1 > L_2 为无符号值(在本例中为size_t)。 A 也属于同一类型。

这个测试是否有效:

if( A > (L_1 - L_2) )
{
    //  do stuff
}

还是等价于

if( 0 > (L_1 - L_2) - A )
{
    //  do stuff
}

if( 0 < A - (L_1 - L_2) )
{
    //  do stuff
}

简化为

if(!(A - (L_1 - L_2) ))
{
    //  do stuff
}

因为一切都是unsigned。最后一件事会尽快A != L_1 - L2“做事”,这不是我想要的。

【问题讨论】:

  • 你更了解哪个?
  • !(A - (L_1 - L_2) ) != A &gt; (L_1 - L_2)
  • @GrijeshChauhan:为什么?给我一个矛盾的证明。
  • 我错了,因为我没读过L_1 &gt; L_2 be unsigned values,而A也未签名??
  • @GrijeshChauhan:是的,A 未签名

标签: c unsigned comparison-operators inequality


【解决方案1】:

我们知道A &gt; (L_1 - L_2) 为真有很多值。 例如,L_1 == L_2A == UINT_MAX

但是0 &gt; (L_1 - L_2) - A 总是假的。因为L1L2A 是无符号操作数,(L_1 - L_2) - A 是无符号表达式。无符号表达式的值始终为&gt;= 0

【讨论】:

  • 问题是我已经断言 A > (L_1 - L_2) 因此我不能从两边减去 A 吗?
  • @user877329 关系运算符的代数等价不再适用于无符号操作数,因为当代数结果无法以无符号类型表示时,它们的环绕行为。
  • 所以我不会冒险表达式为真,期望 A != L_1 - L2
  • 如果我描述的内容成立,那么我无法测试大于,因为在大多数情况下它与 true 等价
  • @user877329 我不明白你的问题,请重新表述
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 2012-11-18
相关资源
最近更新 更多