4

メモリのブロックをゼロに初期化するのは慣用的です

memset(p, 0, size_of_p);

マイナス 1 に初期化したい場合は、次のことができます。

memset(p, -1, size_of_p);

p の型に関係なく、2 の補数表現では、マイナス 1 は 8 ビット整数の場合は 0xff、16 ビット整数の場合は 0xffff、32 ビット整数の場合は 0xffffffff であるためです。

私の懸念は、そのような 2 つの補完的な表現が、現代のコンピューターの領域で普遍的に適用できるかどうかです。このようなコードは、プラットフォームに依存せず、他のプラットフォームに移植できるほど堅牢であると期待できますか?

前もって感謝します。

4

2 に答える 2

4

いいえ、ISOC標準で許可されている負の数を表す3つのスキームがあります。

  • 2の補数;
  • 1の補数; と
  • 符号/大きさ。

ただし、あまり一般的ではない2つのスキームを使用するプラットフォームを見てから、長い時間が経過していることを覚えておく必要があります。最近の実装はすべて2の補数を使用していると言えます。

100%ポータブルにしようとしている場合にのみ、これに関心があります。あなたが99.99999%の携帯性に満足しているタイプの人なら、それについて心配する必要はありません。


1の補数Unisys2200(2010年現在もアクティブ)に関する情報と、レイアウトを説明するこの回答も参照してください。

于 2013-02-05T06:29:14.560 に答える
3

簡単な答えは「はい」ですが、より良い答えは、時期尚早に最適化しているということです。

あなたが速いと思うコードの代わりに明白なコードを書いてください:

  for(i = 0; i < p; i++)
    array[i] = -1;

最適化コンパイラによって、この時期尚早の最適化が常に有効であるかどうかを考えることなく、必要な処理を実行する可能な限り最速の表現に自動的に変換されます(VSでは、pが十分に大きい場合はmemsetになります)。

于 2013-02-05T06:29:19.357 に答える