6

来自开放组基本规范第 7 期,IEEE Std 1003.1-2008:

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

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

4

3 回答 3

11

signbit(-0)

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

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

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

关键是-0否定整数类型,并且整数类型通常不会将负零编码为与正零不同。当整数零转换为浮点时,结果是简单(正)零。但是,-0.否定浮点类型,并且浮点类型确实将负零与正零区分开来。

于 2013-03-11T19:01:37.060 回答
11

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

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

于 2013-03-11T18:41:38.223 回答
2

它没有。该signbit宏返回浮点数据的文字符号位。注意文本:“如果论点的符号”是否定的,而不是“如果论点”是否定的。

C 标准中的脚注 236 阐明:

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

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

于 2013-03-11T18:50:54.080 回答