来自The Open Group Base Specifications Issue 7,IEEE Std 1003.1-2008:
signbit()宏仅在其参数值的符号为负时返回非零值。
为什么signbit(-0)
返回0
?我只是想了解这个决定背后的逻辑。
来自The Open Group Base Specifications Issue 7,IEEE Std 1003.1-2008:
signbit()宏仅在其参数值的符号为负时返回非零值。
为什么signbit(-0)
返回0
?我只是想了解这个决定背后的逻辑。
-0 == +0
,因此,即使宏代码中包含 ((float) -0)
,当它被处理时,符号已经消失了。signbit(-0.0)
或 signbit(-1.0 * 0)
的东西。由于此时不是从整数进行转换,该数字应仍具有符号。signbit(-0)
中:
0
是一个类型为 int
的常量。-0
是取 0
的负值得到的,所以它是类型为 int
的零。signbit(-0)
的结果为 0。signbit(-0.)
:
0.
是一个类型为 double
的常量。-0.
是取 0.
的负值得到的,因此它是类型为 double
的负零。signbit(-0.)
的结果为 1。-0
取反整数类型,而整数类型通常没有将负零与正零区分开来进行编码。当整数零转换为浮点数时,结果是一个简单(正)零。然而,-0.
取反浮点类型,而浮点类型将负零与正零区别对待。-0.0
视为字面量并保持其负数?我以前从未关注过,所以也没有检查过... - cHaosignbit
宏返回浮点数数据的字面 signbit。请注意文本:“如果参数的”符号“为负”,而不是“如果参数”为负”。C标准中的脚注236澄清了这一点:“signbit宏报告所有值的符号,包括无穷大、零和NaN。” 这是一个假设性问题,还是你有一个有缺陷的实现?-0
的符号位是0
。在符号位丢失之后,它才被提升为浮点类型。 - Jonathan Grynspansignbit(-0)
解释为字面上的程序文本,但也许我应该这样做。 - Stephen Canon