int isNegative(int x) {
return ((unsigned) x)>> 31;
}
我正在写一个函数,它需要32位并返回1,如果x < 0,否则返回0。如何在不投射的情况下将带符号的int转换为无符号的int。从signed int转换为unsigned int而不铸造
int isNegative(int x) {
return ((unsigned) x)>> 31;
}
我正在写一个函数,它需要32位并返回1,如果x < 0,否则返回0。如何在不投射的情况下将带符号的int转换为无符号的int。从signed int转换为unsigned int而不铸造
你的问题是写一个函数,采用32位和返回1
如果x < 0
int isNegative(int x) {
return x < 0;
}
这无论什么int
大小工作,并没有调用任何类型转换。我想你已经想到了这个问题。
OP具有不同隐含问题
这需要32位,并返回1,如果x < 0,否则为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;
}
从符号整数到unsigned int的转换而无需进行转换(和)
如何转换signed int
到unsigned int
没有铸造。
简单赋值
int i;
unsigned u = i;
试图使用>>
来合并这两个风险实现定义的行为,应该避免,除非不得已的原因给出。
示例实现定义的行为的一个示例是当有符号整数右移时高位传播。 C11§3.4.22
执行自动类型转换的操作有多种,其中包括赋值,特定条件下的算术运算和函数调用(转换某些参数值)。
因此,你可以简单地通过声明为参数类型实现的(signed
)int
参数unsigned int
转换:
int isNegative(unsigned x) {
return x >> 31;
}
不可否认,但是,功能界面可能是一个有点混乱。因此,你可能更喜欢这样做:
int isNegative(int x) {
unsigned ux = x;
return x >> 31;
}
不过,我不认为这类原因是因为你原来的版本一样清楚,与铸造。类型转换是演员的全部目的,当转换是你需要的(以及你需要的)时,演员就是这个工作的正确工具。
当然,我总体上喜欢@chux建议的更简单的方法族。
不清楚为什么代码不是简单的'return x <0',因为它符合更高层次的目标“如果x <0则返回1,否则返回0”。当然,这不能回答较低的目标 - 我觉得有点不清楚。 – chux
如果你想让你的函数采用32位数据类型,那是一个“long”而非int。 – Fredrik
为什么你需要转换而不铸造?这就是铸造*为*的原因。 –