为什么signbit(-0)返回0?

syn*_*gma 6 c floating-point sign

来自Open Group Base Specifications Issue 7,IEEE Std 1003.1-2008:

当且仅当其参数值的符号为负时,signbit()宏才返回非零值.

为什么要signbit(-0)回来0?我只想了解这一决定背后的逻辑.

cHa*_*Hao 11

在二进制补码中,这是迄今为止最常见的有符号整数表示,没有负零的东西. -0 == +0在所有情况下,甚至是按位.因此,当宏的代码处理它时,即使它包含((float) -0),该符号已经消失.

如果你想测试,你可能会有更好的运气,如signbit(-0.0)signbit(-1.0 * 0).由于此时您没有从整数转换,因此该数字仍应有符号.


Eri*_*hil 10

signbit(-0):

  • 0是类型的常量int.
  • -0是否定的结果0,所以它是类型的零int.
  • 该值转换为浮点数.
  • 浮点值中的符号位为零,因此signbit(-0)产生0.

如果你这样做signbit(-0.):

  • 0.是类型的常量double.
  • -0.是否定的结果0.,所以它是类型的负零double.
  • 浮点值中的符号位为1,因此signbit(-0.)产生1.

关键是-0否定整数类型,并且整数类型通常不将负零编码为与正零不同.当整数零转换为浮点时,结果是一个简单的(正)零.但是,-0.否定浮点类型,并且浮点类型确实从正零明显编码负零.