C 使用移位确定int的符号?

C 使用移位确定int的符号?,c,bit,signed,bits,C,Bit,Signed,Bits,问题是 符号-如果为正,则返回1;如果为零,则返回0;如果为负,则返回-1 法律行动:!~&^ |+> 最多行动:10 评级:2 我曾想过向右移动31以获取符号位,但从技术上讲,0不能是正数和负数吗?对于32位int,您可以这样尝试:- (x >> 31) | (((~x + 1) >> 31) & 1) 在C语言中,移位负整数是实现定义的行为,因此任何移位int的答案通常都是不正确的。尽管如此,如果您假设int的范围好像使用了两个补码编码(或者如果使用了两

问题是

  • 符号-如果为正,则返回1;如果为零,则返回0;如果为负,则返回-1
  • 法律行动:!~&^ |+>
  • 最多行动:10
  • 评级:2

我曾想过向右移动31以获取符号位,但从技术上讲,0不能是正数和负数吗?

对于
32位int
,您可以这样尝试:-

(x >> 31) | (((~x + 1) >> 31) & 1)

在C语言中,移位负整数是实现定义的行为,因此任何移位
int
的答案通常都是不正确的。尽管如此,如果您假设
int
的范围好像使用了两个补码编码(或者如果使用了两个补码),那么首先将
int
强制转换为
unsigned int
将起到作用(由于转换为无符号整数类型的模块化行为)。我不清楚为什么要标记这一点。问题很清楚,询问者描述了问题和尝试。至少给出一个原因。@Ryker闻起来像“请做我的家庭作业”来回答OP的“…0不能是正的和负的…?”从数学上讲,0可以被认为是双符号的,无符号的,只有正的,等等。存在许多模型。给定“如果为正,则返回1;如果为零,则返回0;如果为负,则返回-1”,目标很明确,即给定0时返回什么。在编程要求中,这是一个小的教训:目标是明确的(Hurrh——你很幸运),但是更大的目标可以被不同的解释。您是否悄悄地编写规范代码和/或提出问题?