这两个表达式相等吗?

Are these two expressions equivalent

本文关键字:表达式 两个      更新时间:2023-10-16
int x, N;

且N总是正的。下面两行相等吗?

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

在典型的实现中,是的,它们是等价的:如果x是负的,(unsigned) x将大于INT_MAX。这反过来必然意味着(unsigned) x < (unsigned) N将为假。

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

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

在这种情况下,当x从整型转换为无符号整型时,可能不会产生大于n的值

例如:N的值为INT_MAX, x的值为-2。完成从有符号整型到无符号整型的转换后,N的值是INT_MAX,但x的值是INT_MAX-1。因此,使用第二个if语句,而不是第一个。

在实践中,您可能不会遇到这样的实现。当UINT_MAX的值大于INT_MAX时,if语句具有相同的行为。您总是可以断言这种行为:
static_assert( UINT_MAX > INT_MAX , "" );