まず、最初の前提が間違っています。
int negzero = -0;
適合するアーキテクチャでは通常のゼロを生成する必要があります。
そのための参照は、@ 101010 の回答に記載されています。
3.9.1 基本型 [basic.fundamental] §3:
... 符号付きおよび符号なしの整数型は、C 標準のセクション 5.2.4.2.1 で指定された制約を満たさなければなりません。
C リファレンスの後半: 5.2.4.2.1 整数型のサイズ
... 前方参照: 型の表現 (6.2.6)
および (まだ C): 6.2.6 型の表現 / 6.2.6.2 整数型 § 3
実装が負のゼロをサポートする場合、それらは以下によってのみ生成されます:
そのような構造でnegzero = -0
はなく、負の 0 を生成してはなりません。
次の行では、負の 0 は、それをサポートする実装でビットごとに生成されたと仮定します。
C++ 標準では、負のゼロについてはまったく言及されていません。C 標準では、それらの存在は実装に依存しているとだけ述べています。負のゼロが関係演算子または等価演算子の通常のゼロと等しいかどうかを明示的に述べている段落を見つけることができませんでした。
したがって、C リファレンスで引用します: 6.5.8 関係演算子 §6
< (より小さい)、> (より大きい)、<= (より小さいか等しい)、および >= (より大きいか等しい) の各演算子は、指定された関係が真の場合は 1 を返し、そうでない場合は 0 を返します。 false.92) 結果の型は int です。
C++ 5.9 関係演算子 [expr.rel] §5
両方のオペランド (変換後) が算術型または列挙型の場合、各演算子は、指定された関係が true の場合は true を返し、false の場合は false を返します。
標準の私の解釈では、実装によって整数値 0 (負のゼロ) の代替表現が許可される場合がありますが、それでも値 0 の表現であり、C 6.2.6.2 整数型 § 3 言います:
負のゼロ [...] は、1 つの引数が負のゼロで結果がゼロである[...] +、-、*、/、および % 演算子によってのみ生成されます
つまり、結果が 0 でない場合、負の 0 は通常の 0 として機能する必要があります。
したがって、少なくともこれら 2 行は完全に定義されており、次のようになり1
ます。
std::cout<<(1 << negzero)<<std::endl;
std::cout<<(1 >> negzero)<<std::endl;
この行は、実装に依存するものとして明確に定義されています。
std::cout<<(~negzero)<<(~zero)<<std::endl;
実装にはパディング ビットがある可能性があるためです。パディング ビットがない場合、1 の補数アーキテクチャ~zero
は negzero
であるため、~negzero
を生成する必要0
がありますが、負のゼロを として表示する0
か、 として表示するかを標準で見つけることができませんでした-0
。負の浮動小数点0 はマイナス記号を付けて表示する必要がありますが、整数の負の値について明示的なものはないようです。
関係演算子と等価演算子を含む最後の 3 行については、標準で明示的なものは何もないため、実装定義であると言えます。
TL/DR:
実装依存:
std::cout<<(negzero < zero)<<std::endl;
std::cout<<(negzero <= zero)<<std::endl;
std::cout<<(negzero == zero)<<std::endl;
std::cout<<(~negzero)<<(~zero)<<std::endl;
完全に定義されており、1 を生成する必要があります。
std::cout<<(1 << negzero)<<std::endl;
std::cout<<(1 >> negzero)<<std::endl;