不使用强制转换运算符比较 unsigned int 和 int

Comparison between unsigned int and int without using cast operator

我环顾四周的每个人都有一个关于我的问题的主题,但我找不到。

unsigned int x = 5; 
int y = -3;
if(y<x)
   func1();
else
   func2();

func2 被称为 。但我想要 func1 调用。

我知道在比较这些值时必须使用转换运算符。
但是不允许使用cast运算符或改变变量的类型。

我该如何解决这个问题?

首先检查 y 是否为负值,然后知道 x 总是更大,因为它是无符号的。

如果y不是负数,则直接将其值与x进行比较。我不认为这会导致问题,因为没有负号。

看下面的例子:

if(y<0)
{
    //x>y
    func1();
}
else if (y<x)
{
    //lets say y=3, and x=5
    func1();
}
else
{
    func2();
}

尝试补y (~y),变成2

unsigned int x = 5; 
int y = -3;
if(~y<x)
   func1();
else
   func2();

if语句中的条件可以这样写

if( y < 0 || y<x)
   func1();
else
   func2();

使用更宽的整数数学进行比较。未使用转换,变量类型未更改。
优化的编译器不会进行乘法运算,只会进行整数扩展。
可以使用 * 1LL+ 0LL 代替

int main(void) {
  long long ll = 1;
  unsigned int x = 5;
  int y = -3;
  // if (y < x)
  if (ll * y < ll * x)
    puts("func1();");
  else
    puts("func2();");
  return 0;
}

Output: func1();

long long 通常比 int 宽:参见 How to determine integer types that are twice the width as `int` and `unsigned`?