来自开放组基本规范第 7 期,IEEE Std 1003.1-2008:
当且仅当其参数值的符号为负时,signbit() 宏应返回非零值。
为什么signbit(-0)
返回0
?我只是想了解这个决定背后的逻辑。
来自开放组基本规范第 7 期,IEEE Std 1003.1-2008:
当且仅当其参数值的符号为负时,signbit() 宏应返回非零值。
为什么signbit(-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
在所有情况下,甚至按位。因此,当宏的代码处理它时,即使它包含((float) -0)
,符号也已经消失了。
如果你想测试,你可能有更好的运气,比如signbit(-0.0)
or signbit(-1.0 * 0)
。由于此时您没有从整数转换,因此该数字仍应有符号。
它没有。该signbit
宏返回浮点数据的文字符号位。注意文本:“如果论点的符号”是否定的,而不是“如果论点”是否定的。
C 标准中的脚注 236 阐明:
signbit 宏报告所有值的符号,包括无穷大、零和 NaN。
这是一个假设的问题,还是你有一个错误的实现?