来自 Open Group Base Specifications Issue 7 ,IEEE Std 1003.1-2008:
signbit()宏将返回非零值,当且仅当 其论证价值的标志是否定的。
为什么signbit(-0)
会返回0
?我只是想了解这一决定背后的逻辑。
答案 0 :(得分:11)
在二维补码中,这是迄今为止最常见的有符号整数的表示,没有负零的东西。在所有情况下-0 == +0
,甚至是按位。因此,当宏代码处理它时,即使它包含((float) -0)
,该符号也已消失。
如果你想测试一下,你可能会有更好的运气,例如signbit(-0.0)
或signbit(-1.0 * 0)
。由于您此时未从整数转换,因此该数字仍应有符号。
答案 1 :(得分:10)
在signbit(-0)
:
0
是int
类型的常量。-0
是否定0
的结果,因此它是int
类型的零。signbit(-0)
生成0。如果您改为signbit(-0.)
:
0.
是double
类型的常量。-0.
是否定0.
的结果,因此它是double
类型的负零。signbit(-0.)
生成1。关键是-0
否定整数类型,整数类型通常不会将负零编码为与正零不同。当整数零转换为浮点时,结果是一个简单的(正)零。但是,-0.
否定浮点类型,并且浮点类型会从正零明显编码负零。
答案 2 :(得分:2)
没有。 signbit
宏返回浮点数据的文字符号。请注意文本:“如果参数的符号”为负,而不是“如果参数”为负。
C标准中的脚注236澄清:
signbit宏报告所有值的符号,包括无穷大,零和NaN。
这是一个假设的问题,还是你有一个错误的实施?