9

.Net で符号付きの数値をインデックスとして使用する理由は何ですか?

Python では、負の数を送信することで配列の末尾からインデックスを作成できますが、.Net ではそうではありません。.Net が後でそのような機能を追加するのは簡単ではありません。おそらく、インデックス作成で特別なルールを使用して他のコードを壊す可能性があるためです (ええ、悪い考えですが、私はそれが起こると思います)。

サイズが 2,147,483,647 を超える配列にインデックスを付ける必要があったわけではありませんが、符号付きの数値を選択する理由が本当にわかりません。

コードで符号付きの数値を使用する方が普通だからでしょうか?

編集:これらのリンクを見つけました:

C/C++ での符号なし反復の危険性

符号付きワードの長さとインデックス

Edit2: OK、マシュー・フラッシェンが投稿したスレッドからの他のいくつかの正当な理由:

  • C ライクな言語であるという歴史的な理由
  • c との相互運用
4

4 に答える 4

5

これは、無効なインデックスとして 0 未満の値を使用するという長い伝統によるものかもしれません。要素が見つからない場合、String.IndexOf などのメソッドは -1 を返します。したがって、戻り値は署名されている必要があります。インデックス コンシューマーが符号なしの値を必要とする場合は、a) チェックし、b) 値をキャストして使用する必要があります。符号付きインデックスでは、チェックが必要です。

于 2010-06-17T08:38:14.847 に答える
3

もちろん、簡単にするために。unsigned int でサイズ計算を行うのが面倒ですか?

于 2010-06-17T08:43:15.520 に答える
2

Unsigned は CLS に準拠していません。

于 2010-06-17T08:33:53.217 に答える
0

符号なし数値の主な有用性は、小さい数値から大きい数値を構成する場合、およびその逆の場合に発生します。たとえば、接続から 4 つの符号なしバイトを受信し、それらの値を全体として 32 ビット整数と見なしたい場合、符号なし型を使用すると、次のように簡単に言うことができます。

  値 = バイト 0 | (バイト 1 * 256) | (バイト 2 * 65536) | (byte3*16777216);

対照的に、バイトが署名されている場合、上記のような式はより複雑になります。

最近設計された言語が、符号付きの最長整数型よりも短いすべての型の符号なしバージョンを含めないように設計されている理由が本当にわかりません。 ) 最大の符号付き型に完全に収まる操作は、デフォルトでは、その型で操作しているかのように実行されます。最大の符号付き型の符号なしバージョンを含めると、言語仕様が複雑になります (符号付き型の範囲内に収まる必要がある操作と、符号なし型の範囲内に収まる必要がある操作を指定する必要があるため)。if (unsigned1 - unsigned2 > unsigned3)場合でも「数値的に正しい」結果が得られるように言語を設計しても問題ありません。unsigned2unsigned1[署名なしのラップアラウンドが必要な場合は、明示的に指定しますif ((Uint32)(unsigned1 - unsigned2) > unsigned3)]より大きいです。そのような動作を指定する言語は、C (その歴史を考えると正当化できます)、C#、または vb.net に存在する混乱を大幅に改善することは間違いありません。

于 2012-07-10T16:43:56.527 に答える