0

私がこれを非主観的にすることができることを願っています

固定型言語では、メソッドや関数への入力を、やなどのunsigned型を使用して正の数に制限することがあります。unsigned intunsigned double

しかし、ほとんどの図書館はそのように考えていないようです。C#を取りstring.Lengthます。負になることはありませんが、整数です。同じことがC/C++にも当てはまります。sqrt入力はintまたはdoubleです。これには理由があることを私は知っています...たとえば、引数がファイルから読み取られる可能性があり、(理由はわかりませんが)値を関数に直接送信し、後でエラーをチェックする(またはtry-catchブロックを使用する)ことをお勧めします)。

したがって、ライブラリは自分のコードよりもはるかに優れた設計になっていると思います。では、正の数を表すために符号なしの数を使用する理由は何ですか?キャストしてから署名付きタイプに戻すときのオーバーフローが原因ですか?

4

4 に答える 4

2

C&C ++の場合unsigned、言語に入る前に多くのライブラリが存在していたため、利用可能なのはバニラintだけでした。ライブラリへの新しい追加では、などの符号なしタイプが使用されsize_tます。

.NETの場合、符号なし整数の概念を持たない言語(Visual Basicなど)があります(少なくとも言語機能としては、もちろんSystem.UInt32などのタイプを使用できます)。

于 2010-05-06T19:02:07.220 に答える
2

あなたが言ったことの一部を訂正するために:CとC ++では、sqrt常に浮動小数点型(float、double、またはlong double)を取り、言語には符号なし浮動小数点型は含まれていません。C99は型csqrtを処理するために追加しcomplexますが、これらは(再び)浮動小数点型に基づいています-そしてそれらは複素数を処理するので、とにかく負の実数部を持つ入力から完全に合理的な結果を生成できます。

于 2010-05-06T19:24:59.730 に答える
0

int明示的に大きな値が必要な場合を除いて、私は通常、forループイテレータを使用する傾向があります(この場合size_t、またはssize_t64ビットアーキテクチャの場合はおそらくさらに優れたオプションです)。タイピング作業が多いためunsignedです:)しかし、カウントダウンするときも:

for(unsigned int i=100; i>=0; --i) 
{
    printf("%i\n");
}

何が起こるかを推測します:)負の数を期待していなくても、それらが発生した場合でも信号を送ることはできません。これは時々非常に危険です。

于 2010-05-06T19:08:15.220 に答える
0

システムレベルの言語では、常に異なる符号付き整数型と符号なし整数型が必要になります。
これが、ハードウェアレベルで効率を引き出す方法です。

ただし、符号なし整数型は、単に「負ではない」という意味ではありません。 2の補数演算またはビットパターンが必要でない限り
、符号なし整数型の使用は避けてください 。

符号付き数値を使用する主な動機は、符号付き数値と符号なし数値を混在させると問題が発生することです。ルールは非常に驚くべきものであり、C ++のような言語では、バグとの相関性が高くなります。

代わりに、型の値の静的/動的チェックに依存して、負の数でないことを確認する必要があります。

于 2016-06-09T04:51:07.830 に答える