2009-04-01 17 views
5

最近、私はthis questionで混乱していました。たぶん、私は言語仕様を読んでいなかったからです(それは私のせいです、私は知っています)。コンパイラと負の数の表現

C99標準では、コンパイラによって使用されるべき負の数の表現言っていません。私はいつも負の数を格納する唯一の正しい方法は2の補数であると考えました(ほとんどの場合)。

だからここに私の質問です:あなたは、デフォルトの1の補数または符号大きさを表現することによって実装するすべての現代のコンパイラを知っていますか?いくつかのコンパイラフラグでデフォルト表現を変更できますか?

どの表現を使用するのが最も簡単な方法は何ですか?

C++標準はどうですか?

+0

下の質問でそれについての詳細を読むことができます完了しました。これはおそらく#defineで実行され、コンパイル時に評価されます。 – slipperyseal

+0

この6年間にこの問題を解決していない場合は、 : – slipperyseal

+0

[現実世界の問題であるか、それとも歴史的な問題か?](https://stackoverflow.com/q/161797/995714) –

答えて

5

私はそれがそんなにコンパイラが使用するのではなく、根本的なマシンが使用するものを表現するものの表現の問題ではないと思います。コンパイラは、ターゲットマシンでサポートされていない表現を選択するのは非常に愚かであろう。

IPプロトコルスイートの使用中のいくつかのチェックサムフィールドの1の補数、ので、おそらく専用の「ネットワークアクセラレータ」型CPU:sがそれを実装。

+0

Cコンパイラはありますか? "ネットワークアクセラレータ"型のCPU? – klew

+0

@klew:Google検索のいくつかの激しい時間の後に私が見つけることができたわけではありませんが、それはあまり証明しません。 :) – unwind

1

twos-complement表現ははるかに最も一般的ですが、それは一つだけ(see some)ではありません。 CおよびC++の標準化委員会は、非二元補完マシンに非ネイティブ表現をエミュレートする必要はありませんでした。したがって、Cではなく、特定の負の整数フォーマットが必要です。

これは、符号付き型のビット演算の動作が未定義になります。 1の補数演算を実装

+0

はい、それは私が求めていることではありません。デフォルトではnon-twoのコンプリメントを使うCコンパイラを知っていますか? – klew

+0

非トウの補数を使用するシステム用のもの...明らかに、まだサポートされているUnisysボックスが含まれています(これは2番目のリンクにリストされている可能性があります)。 – Richard

関連する問題