5

最近、私はこの質問に戸惑いました。言語仕様を読んでいなかったからかもしれません (私のせいです、私は知っています)。

C99 標準では、コンパイラがどの負の数値表現を使用する必要があるかは規定されていません。私は常に、負の数を格納する唯一の正しい方法は 2 の補数であると考えていました (ほとんどの場合)。

ここで私の質問です。デフォルトで 1 の補数表現または符号 - 絶対値表現を実装する現在のコンパイラを知っていますか? コンパイラ フラグを使用してデフォルトの表現を変更できますか?

どの表現が使用されているかを判断する最も簡単な方法は何ですか?

C++ 標準についてはどうでしょうか。

4

3 に答える 3

5

コンパイラがどの表現を使用するかという問題ではなく、基礎となるマシンがどの表現を使用するかという問題だと思います。コンパイラは、ターゲット マシンでサポートされていない表現を選択するのは非常に愚かです。

IP プロトコル スイートの一部のチェックサム フィールドは 1 の補数を使用するため、おそらく専用の「ネットワーク アクセラレータ」タイプの CPU がそれを実装します。

于 2009-04-01T10:25:27.787 に答える
1

1の補数演算を実装するUNISYS 2200 シリーズは、かなり更新されたコンパイラでまだ使用されています。詳細については、以下の質問をご覧ください。

于 2015-05-14T04:42:44.087 に答える
1

2 の補数表現が最も一般的ですが、これだけではありません (一部を参照)。C および C++ の標準化委員会は、非 2 の補数マシンが非ネイティブな表現をエミュレートすることを要求したくありませんでした。したがって、C も C++ も特定の負の整数形式を必要としません。

これにより、符号付き型に対するビット演算の未定義の動作が発生します。

于 2009-04-01T10:52:59.810 に答える