Open Group Base Specification Issue 7、IEEE Std 1003.1-2008から:
signbit()マクロは、引数値の符号が負の場合にのみ、ゼロ以外の値を返します。
なぜsignbit(-0)戻るの0ですか?この決定の背後にある論理を理解したいだけです。
Open Group Base Specification Issue 7、IEEE Std 1003.1-2008から:
signbit()マクロは、引数値の符号が負の場合にのみ、ゼロ以外の値を返します。
なぜsignbit(-0)戻るの0ですか?この決定の背後にある論理を理解したいだけです。
最近の符号付き整数の最も一般的な表現である2の補数では、負のゼロなどはありません。 -0 == +0すべての場合で、ビット単位でも。したがって、マクロのコードがそれを処理するときまでに、たとえそれが含まれていても((float) -0)、記号はすでに消えています。
テストしたい場合は、signbit(-0.0)またはのようなもので運が良いかもしれませんsignbit(-1.0 * 0)。その時点では整数から変換していないので、数値にはまだ符号が付いているはずです。
でsignbit(-0):
0タイプの定数ですint。-0は否定の結果である0ため、タイプはゼロですint。signbit(-0)、0を生成します。signbit(-0.)代わりに行う場合:
0.タイプの定数ですdouble。-0.は否定の結果である0.ため、タイプの負のゼロですdouble。signbit(-0.)、1を生成します。重要なのは-0整数型を否定することであり、整数型は通常、正のゼロとは異なり、負のゼロをエンコードしません。整数のゼロが浮動小数点に変換されると、結果は単純な(正の)ゼロになります。ただし、-0.浮動小数点型を否定し、浮動小数点型は正のゼロとは明確に負のゼロをエンコードします。
そうではありません。マクロは、浮動小数点データのsignbitリテラル符号ビットを返します。「引数の符号が負の場合」ではなく、「引数の符号が負の場合」というテキストに注意してください。
C規格の脚注236は、次のことを明確にしています。
signbitマクロは、無限大、ゼロ、NaNを含むすべての値の符号を報告します。
これは架空の質問ですか、それともバグのある実装がありますか?