首页 文章

为什么signbit(-0)返回0?

提问于
浏览
6

来自Open Group Base Specifications Issue 7,IEEE Std 1003.1-2008:

当且仅当其参数值的符号为负时,signbit()宏才返回非零值 .

为什么 signbit(-0) 返回 0 ?我只想了解这一决定背后的逻辑 .

3 回答

  • 2

    在二进制补码中,这是迄今为止最常见的有符号整数表示,没有负零 . -0 == +0 在所有情况下,甚至是按位 . 因此,当宏的代码处理它时,即使它包含 ((float) -0) ,该符号也已经消失 .

    如果你想测试,你可能会有更好的运气,如 signbit(-0.0)signbit(-1.0 * 0) . 由于此时您没有从整数转换,因此该数字仍应有符号 .

  • 10

    它没有 . signbit 宏返回浮点数据的文字符号 . 请注意文本:"if the sign of the argument"是否定的,而不是"if the argument"是否定的 .

    C标准中的脚注236阐明:

    signbit宏报告所有值的符号,包括无穷大,零和NaN .

    这是一个假设的问题,还是你有一个错误的实施?

  • 11

    signbit(-0)

    • 0int 类型的常量 .

    • -0 是否定 0 的结果,因此它是 int 类型的零 .

    • 此值转换为浮点数 .

    • 浮点值中的符号位为零,因此 signbit(-0) 产生0 .

    如果你改为 signbit(-0.)

    • 0.double 类型的常量 .

    • -0. 是否定 0. 的结果,因此它是 double 类型的负零 .

    • 浮点值中的符号位为1,因此 signbit(-0.) 产生1 .

    关键是 -0 否定整数类型,并且整数类型通常不会将负零编码为与正零不同 . 当整数零转换为浮点时,结果是一个简单的(正)零 . 但是, -0. 否定浮点类型,并且浮点类型确实从正零明显编码负零 .

相关问题