int isNegative(int x) {
return ((unsigned) x)>> 31;
}
我正在编写一个占用32位的函数,如果x <0则返回1,否则返回0。如何在不进行强制转换的情况下将signed int转换为unsigned int。
答案 0 :(得分:3)
OP有不同的隐含问题
一个32位的函数,如果x <0则返回1,否则返回0。
int isNegative(int x) {
return x < 0;
}
// or maybe return bool/_Bool
bool isNegative(int x) {
return x < 0;
}
// or pedantically
int isNegative(int_least32_t x) {
return x < 0;
}
// or pedantically and nearly universally portable,
int isNegative(int32_t x) {
return x < 0;
}
从signed int转换为unsigned int而不进行强制转换(和)
如何在不投标的情况下将signed int
转换为unsigned int
。
只需指定值
即可 int i;
unsigned u = i;
尝试使用>>
将这两种风险实施定义的行为结合起来,除非有令人信服的理由,否则应该避免这种行为。
示例实现定义的行为的示例是当有符号整数向右移位时高阶位的传播。 C11§3.4.22
答案 1 :(得分:0)
在这种情况下,你不需要。如果你摆脱了演员,右移保留了标志位。
假设int
为32位,删除强制转换的结果为-1,非负数则为0。虽然非负情况的实际返回值不同,但在布尔上下文中它将按预期工作。
答案 2 :(得分:0)
您的问题是编写一个占用32位的函数,如果1
x < 0
int isNegative(int x) {
return x < 0;
}
无论int
的大小如何,这都会有效,并且不会调用任何类型的转换。我想你已经过度思考了这个问题。
答案 3 :(得分:0)
有多种操作可以执行自动类型转换,其中包括赋值,某些条件下的算术运算和函数调用(某些参数值的转换)。
因此,您可以简单地通过声明为参数类型来实现(signed
)int
参数到unsigned int
的转换:
int isNegative(unsigned x) {
return x >> 31;
}
然而,不可否认,该功能界面可能有点令人困惑。您可能更喜欢这样做:
int isNegative(int x) {
unsigned ux = x;
return x >> 31;
}
但是,我不认为其中任何一个都与原始版本一样清晰。类型转换是演员表的全部目的,当您需要转换(以及您需要的所有内容)时,演员阵容是该作业的正确工具。
当然,我总体上更喜欢@chux建议的更简单的方法系列。