不使用强制转换运算符比较 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`?
我环顾四周的每个人都有一个关于我的问题的主题,但我找不到。
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`?