86

符号付き変数よりも符号なし変数を使用するのが適切なのはいつですか? forループではどうですか?

これについて多くの意見を聞いており、コンセンサスに似たものがあるかどうかを確認したかった.

for (unsigned int i = 0; i < someThing.length(); i++) {  
    SomeThing var = someThing.at(i);  
    // You get the idea.  
}

Java には符号なしの値がないことを私は知っています。これは、 Sun Microsystems側の意識的な決定であったに違いありません。

4

5 に答える 5

70

これまであまり考えたことがなかったので、この話題について良い会話を見つけることができてうれしかった.

要約すると、(典型的な for ループの場合のように) 変数に対して演算を実行する場合は、すべての数値が正であると確信している場合でも、signed は一般的に適切な選択です。

unsigned は、次の場合に意味を持ち始めます。

  • マスクなどのビット単位の処理を行うか、
  • その余分な正の範囲の符号ビットを利用したいと切望しています。

個人的には、一貫性を保ち、2 つのタイプを混在させることを避ける自信がないため (記事で警告されているように)、signed が好きです。

于 2008-08-02T03:49:21.987 に答える
10

上記の例では、「i」が常に正であり、より高い範囲が有益である場合、unsigned が役立ちます。次のような 'declare' ステートメントを使用している場合のように:

#declare BIT1 (unsigned int 1)
#declare BIT32 (unsigned int reallybignumber)

特にこれらの値が決して変わらない場合。

ただし、人々がお金に無責任で常に赤字である会計プログラムを行っている場合は、間違いなく「署名済み」を使用する必要があります.

私は saint に同意しますが、大まかな経験則としては、C が実際にデフォルトで使用する signed を使用することをお勧めします。

于 2008-08-02T04:31:54.803 に答える
10

ビジネス ケースで負の数が無効であると規定されている場合は、エラーを表示またはスローする 必要があると思います。

そのことを念頭に置いて、バイナリ ファイルのデータを処理し、そのデータをデータベースに格納するプロジェクトに取り組んでいるときに、符号なし整数について知ったのはつい最近のことです。意図的にバイナリ データを「破損」させていたため、予想されるエラーではなく負の値が返されました。値が変換されたとしても、その値は私のビジネス ケースには有効ではないことがわかりました。
私のプログラムはエラーを出さず、データベースに間違ったデータを入れてしまいました。uint使用してプログラムが失敗した方がよかったでしょう。

于 2008-11-10T19:04:05.793 に答える
8

CおよびC++コンパイラは、符号付き型と符号なし型を比較す​​ると警告を生成します。サンプルコードでは、ループ変数を符号なしにして、コンパイラに警告なしでコードを生成させることはできませんでした(警告がオンになっていると仮定します)。

当然のことながら、警告を完全に上げてコンパイルしていますよね?

そして、それをさらに一歩進めるために、「警告をエラーとして扱う」でコンパイルすることを検討しましたか?

符号付き数値を使用することの欠点は、たとえば、値0-> nがメニュー選択であり、-1は何も選択されていないことを意味するように、それらをオーバーロードしたいという誘惑があることです。何かが選択されているかどうかを示し、その選択が何であるかを保存するために別のものを示します。あなたがそれを知る前に、あなたはいたるところにネガティブなものをテストしていて、コンパイラはあなたがメニュー選択をあなたが持っているメニュー選択の数とどのように比較したいかについて不平を言っています-しかしそれらは異なるタイプなので危険です。だからそうしないでください。

于 2008-08-04T13:35:41.273 に答える
6

size_tsize_type多くの場合、この場合、または STL クラスを使用している場合に適しています。

于 2008-08-02T05:51:57.247 に答える