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

6

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

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

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


4
必须使用二进制补码。 - Mike
1
0 在内部表示为 00000000(在 8 位中),其符号位为 0(因此返回 0),例如 -1 在内部表示为 11111111(在 8 位中)其符号位为 1。这就是你看到的东西。 - Benjamin Gruenbaum
3个回答

11
在二进制补码中,这是目前表示有符号整数最常用的方法,在其中没有负零这个概念。在所有情况下,包括按位运算,-0 == +0,因此,即使宏代码中包含 ((float) -0),当它被处理时,符号已经消失了。
如果您想进行测试,您可以尝试类似于 signbit(-0.0)signbit(-1.0 * 0) 的东西。由于此时不是从整数进行转换,该数字应仍具有符号。

1
符号位宏仅适用于浮点数据,而浮点数据通常不以二进制补码形式表示。 - Stephen Canon
@StephenCanon:嗯,这有点尴尬。:) 希望修正后的解释能够解决这个问题。 - cHao

11
signbit(-0) 中:
  • 0 是一个类型为 int 的常量。
  • -0 是取 0 的负值得到的,所以它是类型为 int 的零。
  • 该值转换为浮点数。
  • 浮点值中的符号位为零,因此 signbit(-0) 的结果为 0。
如果您使用 signbit(-0.)
  • 0. 是一个类型为 double 的常量。
  • -0. 是取 0. 的负值得到的,因此它是类型为 double 的负零。
  • 浮点值中的符号位为一,因此 signbit(-0.) 的结果为 1。
关键在于,-0 取反整数类型,而整数类型通常没有将负零与正零区分开来进行编码。当整数零转换为浮点数时,结果是一个简单(正)零。然而,-0. 取反浮点类型,而浮点类型将负零与正零区别对待。

C语言是否会将 -0.0 视为字面量并保持其负数?我以前从未关注过,所以也没有检查过... - cHao
1
cHao:基本的C标准对浮点数的处理并不严格。通常的实现,特别是使用IEEE 754的实现,会在浮点数零值中保留符号位,尤其是在简单操作中。(例如,在某些实现中,库例程在符号处理方面可能不够严格,这并不令人惊讶。) - Eric Postpischil

2
它并不会。 signbit 宏返回浮点数数据的字面 signbit。请注意文本:“如果参数的”符号“为负”,而不是“如果参数”为负”。C标准中的脚注236澄清了这一点:“signbit宏报告所有值的符号,包括无穷大、零和NaN。” 这是一个假设性问题,还是你有一个有缺陷的实现?

我正在学习C语言并尝试使用各种函数。 - syntagma
2
-0的符号位是0。在符号位丢失之后,它才被提升为浮点类型。 - Jonathan Grynspan
@JonathanGrynspan:没错,我没有将signbit(-0)解释为字面上的程序文本,但也许我应该这样做。 - Stephen Canon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接