2016-09-18 98 views
0
int isNegative(int x) { 
    return ((unsigned) x)>> 31; 
} 

我正在写一个函数,它需要32位并返回1,如果x < 0,否则返回0。如何在不投射的情况下将带符号的int转换为无符号的int。从signed int转换为unsigned int而不铸造

+4

不清楚为什么代码不是简单的'return x <0',因为它符合更高层次的目标“如果x <0则返回1,否则返回0”。当然,这不能回答较低的目标 - 我觉得有点不清楚。 – chux

+1

如果你想让你的函数采用32位数据类型,那是一个“long”而非int。 – Fredrik

+3

为什么你需要转换而不铸造?这就是铸造*为*的原因。 –

回答

0

在这种情况下,你不需要。如果你摆脱了剧组,右移保留了符号位。

假设int是32位,删除转换结果的结果是负数为-1,非负数为0。虽然实际返回值在非负情况下有所不同,但在布尔上下文中,它将按照您的预期工作。

+2

详细信息:“结果-1为负数,0为非负”是_very_ common但实现定义的行为。 – chux

+0

答案是有限制的,但DV过多。 – chux

0

你的问题是写一个函数,采用32位和返回1如果x < 0

int isNegative(int x) { 
    return x < 0; 
} 

这无论什么int大小工作,并没有调用任何类型转换。我想你已经想到了这个问题。

3

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 intunsigned int没有铸造。

简单赋值

int i; 
unsigned u = i; 

试图使用>>来合并这两个风险实现定义的行为,应该避免,除非不得已的原因给出。

示例实现定义的行为的一个示例是当有符号整数右移时高位传播。 C11§3.4.22

0

执行自动类型转换的操作有多种,其中包括赋值,特定条件下的算术运算和函数调用(转换某些参数值)。

因此,你可以简单地通过声明为参数类型实现的(signedint参数unsigned int转换:

int isNegative(unsigned x) { 
    return x >> 31; 
} 

不可否认,但是,功能界面可能是一个有点混乱。因此,你可能更喜欢这样做:

int isNegative(int x) { 
    unsigned ux = x; 
    return x >> 31; 
} 

不过,我不认为这类原因是因为你原来的版本一样清楚,与铸造。类型转换是演员的全部目的,当转换是你需要的(以及你需要的)时,演员就是这个工作的正确工具。

当然,我总体上喜欢@chux建议的更简单的方法族。

相关问题