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