C 获取浮点的有符号位

C 获取浮点的有符号位,c,C,我试图找到一种方法来检查一个浮点数是否为负数而不进行分支 float a = -0.5; int getSignOfa= *(int*)&a >> 31; //type-pun to int and get signed bit; 这是检查浮点符号位的安全方法吗?自C99以来,您可以使用math.h中定义的signbit(x)来获取浮点数字的符号位。如果x为正(未设置符号位),则返回0;如果为负(设置符号位),则返回非零。您可以使用math.h中提供的copysign()函

我试图找到一种方法来检查一个浮点数是否为负数而不进行分支

float a = -0.5;
int getSignOfa= *(int*)&a >> 31; //type-pun to int and get signed bit;

这是检查浮点符号位的安全方法吗?

自C99以来,您可以使用
math.h
中定义的
signbit(x)
来获取浮点数字的符号位。如果
x
为正(未设置符号位),则返回0;如果为负(设置符号位),则返回非零。

您可以使用
math.h
中提供的
copysign()
函数来获取
float
数字的符号

float sign = copysign(1, float_num);

根据输入类型,
符号
的值将为
+1
-1

signbit函数是否为无符号函数?它需要作为宏实现,但它是由实现定义的@Zachwuzhere你为什么关心这个?基准测试,如果它真的很慢,那么优化它,否则这是过早的优化。标准的方法通常是更好的解决方案,我只想补充一点,
bool s=a<0.0f
不会分支。这是一种比较,可能只是某种fsub指令,然后屏蔽和移位浮点状态寄存器。还有NAN和Infinity呢?@Fred这也是实现定义的。安全的?不,因为不能保证
float
int
的大小相同,而且这也违反了严格的别名规则,请选择一种编程语言。你已经标记了2。解决方案有所不同。请注意,根据目标体系结构,这种类型转换可能非常慢。在powerpc上,这将采用寄存器中的浮点值。将其保存到堆栈上的内存中。从内存中读回,将其放入GPR寄存器。然后移位并屏蔽探地雷达寄存器。或者你可以有一个
int negative=a<0.0f
,这是两条指令。不,它不总是有效的。根据编译器和优化级别,编译器可以看到此操作未被C语言定义,并将getSignOfa设置为它想要的任何值。请参阅@Zachwuzhere您正在编写的大部分内容都是实现定义的。这就是用汇编以外的语言编写的要点。编译器将执行它认为最适合您的处理器体系结构的操作。如果您想获得最佳性能,请使用类似于
signbit
的语言,因为即使是内联汇编也会导致编译器进行额外的寄存器重新排列以适应它。然后OP有另一个浮点,仍然不知道它是否为负