チラ見した範囲でははっきりとした規定が見つかりませんでした。個の銅バッジC/C++のコンパイラがある1の補数なシステムってあるのでしょうか。UNIVAC1100系だと命令セットのTestEqualは単純なビット比較なので-0と0は等しくないですが、TestZeroでは-0/+0ともに真になったと思います。等しいという規定は無いように思います。変換される可能性があることから、積極的に利用する機能では無さそうです。その辺の文言を見つけました。自己回答にてフォローしておきます。relation)が真なら1、偽なら0としか規定されていません。ビット列が同じであれば必ず真(逆に言うとビット列が違っていれば必ず偽)ということではありません。この関係とは何かということは具体的には次の所で言及されています。relationships)をサポートしているとしています。(上の引用文の後にNaNに対する言及があります。)上記のことから、C11における==及び!=は数学的関係における等価と同じとなっています。そのため、浮動小数点数における+0.0と-0.0は等しいとなっています(これはC11がIEEE754を採用しているからではなく、C11がIEEE754をそのまま採用できる浮動小数点数を規定しているだけに過ぎません)。これと同様に、1の補数系での+0と-0は数学的に等しいと考えら、==は真、!=は偽になると推測されます。C++については確認していません。1の補数系である処理系が手元にないため、実際にそうなのまではわかりません。9899:2011は持っていないので、そこまでは確認できていません。中で定義されているマクロの挙動に限定されている、とオイラは判断します。主張は浮動小数点数限定であり、整数演算には適用されないとオイラは思ってます。later."と述べており、浮動小数点数に限定して述べている章ではないかと思います。9:12C言語が「通常の数学的関係」に極力従うということは@らっしーさんのおっしゃる通り正しいような気がします(なのでC言語で書かれた-0==+0は真)。(LIA−1)"という文で、LIA-1にはIntegerに関しても演算が定義されています。"とありそのあとの定義は全てここであげられた"operator"のみ使われているので==が意味するのはC言語では数学的な=ということになります。ちなみに、これを1の補数を使う処理系で実現するためには-0が起こりうる演算結果同士の比較にコンパイラは複数の命令を使わざるを得ないと思うので、とても不効率な処理系に思えます。なるな・・・と思ったところにあります。この場合に1ビットフィールドの比較が意味あるのだろうか、と思うとなんだかもやもやします。(LIA−1)"であり意味が変わるので不適切でした。operationsにLIA-1との関連付けもあるので結論は同じです。次の解説を見つけました。符号ビットが1ですべての値ビットが0である数(符号と絶対値若しくは2の補数の場合)、または符号ビットが1ですべての値ビットが1である値(1の補数の場合)が、トラップ表現であるか又は通常の値であるかも処理系定義とする。この表現が通常の値であるならば、これを負の0と呼ぶ。[処理系が負の0をサポートする場合に、演算が]実際に負の0を生成するか、又は通常の0を生成するかは未規定とする。負の0がオブジェクトに格納されるとき通常の0になるかどうかも未規定とする。負の0を生成する演算の結果は未定義とする。比較すること以前の問題なようです。偽、と考えてほぼ間違いないようです。これだけだと微妙ですが符号ビットが違うので真になると期待したいところです。(「未定義」の動作の中には「プログラマが勝手に期待するとおりの動作」も含まれますし)まあ今時1の補数を使う処理系がどれだけ存在するか、実用されるかは定かではありませんが。|2C++20では符号付き整数型が2の補数表現であることを規定されました。C++言語では1の補数を使う処理系がサポートされなくなりました。|1C/C++のコンパイラがある1の補数なシステムってあるのでしょうか?昔のUNIVAC1100系だと命令セットのTestEqual(==)/TestNotEqual(!=)は単純なビット比較なので-0と0は等しくないです。代わり(?)にゼロかを確認する専用の命令TestZero/TestNonZeroでは-0/+0ともに同じ扱いです。書いてありそりゃただの(正の)ゼロだろと突っ込みが入ってそっち系の回答にチェックが付いてしまっています。zero)<<std::endl;は(規格書から明確な文言を探しきれなかったので)処理系定義という意見が述べられています。言語規格書にそう明示されている場合に限ると解釈しているので後者2つは「未規定」であると思うところです。整数に関しては対象外な気がします。ついてはまだ検証していません。|0今更ですが古いCも含めて考えると、C言語が元々アセンブラの薄いラッパー(wrapper)で、処理系定義が基本的な考え方として考えると、1の補数処理系でもCPUの比較命令(x86で言うCMP)の結果そのものが使われると思います。使うCの世代の仕様(コンパイラの仕様書)を見てはっきりしない時は使うCPUの仕様を見た方が確実かも知れません。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。