int x, N;
和N总是积极的。以下两行是否相同?
if (x>=0 && x<N)
if ( (unsigned)x < (unsigned)N )
答案 0 :(得分:2)
在典型的实现中,是的,它们是等效的:如果x
为负,(unsigned) x
将大于INT_MAX
。这反过来又意味着(unsigned) x < (unsigned) N
将是假的。
在罕见的实现中,不,它们不等同。允许实现为int
和unsigned 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 , "" );