9

C# を使い始める前は、ほとんど C/C++ のバックグラウンドを持っていました。C# での最初のプロジェクトで行ったことの 1 つは、このようなクラスを作成することでした。

class Element{
  public uint Size;
  public ulong BigThing;
}

次に、これにはキャストが必要であるという事実に悔やまれました。

int x=MyElement.Size;

同様に

int x=5;
uint total=MyElement.Size+x;

言語設計者が、符号付きおよび符号なしの整数型を暗黙的にキャストできないようにしたのはなぜですか? また、.Net ライブラリ全体で unsigned 型があまり使用されないのはなぜですか? たとえばString.Length、負になることはありませんが、符号付き整数です。

4

5 に答える 5

18

言語設計者が、符号付きおよび符号なしの整数型を暗黙的にキャストできないようにしたのはなぜですか?

これは、データを失ったり、例外をスローしたりする可能性があるためです。一般に、どちらも暗黙的に許可するのは良いことではありません。(long から double への暗黙的な変換も、確かにデータを失う可能性がありますが、その方法は異なります。)

また、.Net ライブラリ全体で unsigned 型があまり使用されないのはなぜですか

符号なしの型は CLS に準拠していません。すべての .NET 言語が常にそれらをサポートしているわけではありません。たとえば、Visual Basic には、.NET 1.0 および 1.1 の符号なしデータ型に対する "ネイティブ" サポートがありませんでした。2.0 の言語に追加されました。(これらは引き続き使用できますが、言語自体の一部ではありませんでした。たとえば、通常の算術演算子は使用できませんでした。)

于 2010-07-15T20:58:19.680 に答える
4

ジョンの答えに加えて、符号なしの数値が負になり得ないからといって、それが符号付きの数値より大きくないことを意味するわけではありません。uintint0〜4,294,967,295ですが、-2,147,483,648〜2,147,483,647です。int損失の最大値を超える十分なスペース。

于 2010-07-15T21:01:56.440 に答える
1

3Bの符号なし整数を符号付き整数に暗黙的に変換すると爆発するからです。

Unsignedは、signedの最大値の2倍です。これは、intにlongをキャストできないのと同じ理由です。

于 2010-07-15T21:01:00.843 に答える
1

次に、これにはキャストが必要であるという事実に悔やまれました。

 int x=MyElement.Size;

しかし、あなたはここで矛盾しています。Size を (signed) x に割り当てるよりも unsigned にする必要がある場合は、エラーになります。コードの深刻な欠陥。

たとえば、String.Length は負になることはありませんが、符号付き整数です

ただし、String.IndexOf は負の数を返す可能性があり、String.Length と Index の値が異なる型の場合は厄介です。

理論的には unsigned String.Length (4 GB の上限) にはメリットがありますが、実際には現在の 2 GB でさえ十分な大きさです (そのような長さの文字列はまれであり、とにかく実行できないため)。

したがって、本当の答えは次のとおりです。そもそもなぜ unsigned を使用するのでしょうか。

于 2010-07-15T21:18:07.413 に答える
0

2 つ目は、CLR が符号なしデータ型を持たない言語 (VB.NET を参照) と互換性を持つことを望んでいたためです。

于 2010-07-15T21:05:53.913 に答える