这两个表达式是否相同

时间:2016-11-05 11:38:05

标签: c++ c

int x, N;

和N总是积极的。以下两行是否相同?

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

if ( (unsigned)x < (unsigned)N )

2 个答案:

答案 0 :(得分: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 :(得分: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 , "" );