来自开放组基本规范第 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。
这是一个假设的问题,还是你有一个错误的实现?