2016-11-05 155 views
0
int x, N; 

并且N总是正值。以下两行是否相同?这两个表达式是否相等

if (x>=0 && x<N)  

if ((unsigned)x < (unsigned)N) 
+1

是的。这是[this]的一个特例(http://stackoverflow.com/a/17095534/995714) –

+1

我想知道为什么这个问题投下了票 –

+0

如果您认为任何答案已解决您的问题,请考虑接受它(答案左边的绿色复选标记)。这将向社区表明,该问题已得到解答,并将为您和回答者提供一些声誉。 – 2501

回答

2

在典型的实现,是的,他们是等价的:如果x为负,(unsigned) x会比INT_MAX更大。这又意味着(unsigned) x < (unsigned) N将是错误的。

在罕见的实现中,不,它们不是等价的。允许实现允许intunsigned int具有相同数量的值位(INT_MAX == UINT_MAX),在这种情况下(unsigned) x将不会大于INT_MAX,并且(unsigned) x < (unsigned) N可能仍然为真。

1

当UINT_MAX等于INT_MAX时,这些行不相等。 C允许这样的实现。

在这种情况下缠绕,当x从int转换为一个unsigned int,可能不会产生一个值,该值比N

例如较大:N的值是INT_MAX,该值的x是-2。在完成从signed int到unsigned int的转换后,N的值为INT_MAX,但x的值为INT_MAX-1。因此,第二条if语句被采用,但不是第一条。

实际上你可能不会遇到这样的实现。当UINT_MAX的值大于INT_MAX时,if语句具有相同的行为。你总是可以断言这种行为:

static_assert(UINT_MAX > INT_MAX , ""); 
+0

也不存在具有UINT_MAX == INT_MAX的现有(过去或现在)实现。我认为这是一种理论上的未来可能性,但不会在这种情况下赌钱。 – Peter

+0

@Peter现在有一些非常奇怪的实现,在这些实现上几乎没有任何信息可以在网上找到。有些事情,我会发誓永远不会存在,但没有任何检查的方式。您是否有权威来源确认您的声明是否存在此类实现? – hvd