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

时间:2013-03-11 18:36:04

标签: c floating-point sign

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

  

signbit()宏将返回非零值,当且仅当   其论证价值的标志是否定的。

为什么signbit(-0)会返回0?我只是想了解这一决定背后的逻辑。

3 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:10)

signbit(-0)

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

如果您改为signbit(-0.)

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

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

答案 2 :(得分:2)

没有。 signbit宏返回浮点数据的文字符号。请注意文本:“如果参数的符号”为负,而不是“如果参数”为负。

C标准中的脚注236澄清:

  

signbit宏报告所有值的符号,包括无穷大,零和NaN。

这是一个假设的问题,还是你有一个错误的实施?