15

ISO C 標準では、2 の補数、1 の補数、および符号/大きさの 3 つの符号付き整数のエンコード方法が許可されています。

実行時にエンコーディングを検出する効率的または良い方法は何ですか (または、より良い解決策がある場合は別の時間に)? さまざまな可能性に合わせてbignumライブラリを最適化できるように、これを知りたいです。

私はこれを計算し、プログラムが実行されるたびに変数に格納することを計画しているので、非常に高速である必要はありません-プログラムの実行中にエンコーディングが変更されないことを前提としています:-)

4

5 に答える 5

17

-1のようなもので定数の下位ビットをチェックするだけ-1 & 3です。これは次のように評価されます

  1. 符号と大きさについては、
  2. 自分の補完のために
  3. 2 の補数の場合。

#if #elseこれは、コンストラクト内のプリプロセッサ式でも実行できるはずです。

于 2010-09-29T07:22:05.500 に答える
12

1 の補数の検出は非常に単純なはずです - のようなものですif (-x == ~x)。2 の補数の検出は、ほぼ同じくらい簡単ですif (-x == ~x + 1)。どちらでもない場合は、符号/大きさでなければなりません。

于 2010-09-29T06:39:37.157 に答える
2

コンパイル時にそれをしないのはなぜですか?必要に応じて、ビルド スクリプト/makefile でテスト プログラムをコンパイルすることもできますが、プリプロセッサを使用して条件付きコンパイルを行うこともできます。これは、実行ごとに 1 回ではなく、コンパイルごとに 1 回しか実行されないため、パフォーマンスがそれほど重要でないことも意味します。

于 2010-09-29T06:39:44.243 に答える
0

特徴的なビット パターンを示す int へのポインターを取得します。unsigned int へのポインターとしてキャストし、ビット値を調べます。

慎重に選択したいくつかの値を使用してこれを行うと、必要なことが行われるはずです。

于 2010-09-29T06:41:36.610 に答える
-1

int負の数を保持するのに十分な大きさのchar配列に として格納し、その配列をさまざまな表現と比較して調べると思います。

しかし、ええと... 符号なし整数には符号があってはなりませんね。

于 2010-09-29T06:40:02.443 に答える