unsigned intがCLSに準拠していないのはなぜですか?


111

符号なし整数がCLSに準拠していないのはなぜですか?

型の指定はパフォーマンスのためだけのものであり、正確さのためではないと考え始めています。

回答:


88

すべての言語にunsigned intの概念があるわけではありません。たとえば、VB 6にはunsigned intの概念がなかったため、VB7 / 7.1の設計者も実装しないように決定しました(現在はVB8で実装されています)。

引用するには:

http://msdn.microsoft.com/en-us/library/12a7a7h3.aspx

CLSは、開発者が一般的に必要とする言語構造を含めるのに十分な大きさでありながら、ほとんどの言語がそれをサポートできるように十分に小さく設計されています。さらに、コードの型の安全性を迅速に検証することを不可能にする言語構造はCLSから除外されたため、すべてのCLS準拠言語は、そうすることを選択した場合に検証可能なコードを生成できます。

更新:私はこれについて数年前に疑問に思っていましたが、UIntがタイプセーフで検証できない理由はわかりませんが、CLSの担当者は、ベースラインの最小値がどこかについてカットオフポイントをどこかに持っている必要があると思いますサポートされる値タイプの数。また、より多くの言語がCLRに移植される長期について考えるとき、絶対に概念がない場合に、なぜ署名なし整数を実装してCLSに準拠するよう強制するのでしょうか。


@ケビン:私はちょうどトピックについて疑問に思いました。答えは論理のようです。私はそのトピックについて考えたいだけです。PascalのようなタイプがCLRに入らなかったのは残念だと思います。しかし、他の言語についてのあなたの議論:強く静的に型付けされたCLRでIronPythonが強力な動的型付け(DLR)を使用することを止めなかったのですか?
doekman 2008

@doekman:はい、IronPythonとIronRubyは、CLRが動的に型付けされた言語を構築できるプラットフォームを提供できることを示していますが、CLSの目標は、言語機能を超越し、それらを正常かつ安全に相互運用できる一連の標準を提供することでした。言語にDL機能を追加するということは、CLS / CTSに何を入れるべきかとは直接関係がないと思います。
ケブ

私の理解から、CLRには32ビット整数プリミティブ型が1つあり、オーバーフローチェック付きの符号付き加算、オーバーフローチェック付きの符号なし加算、および符号に依存しない加算mod 2 ^ 32などの個別の命令があります。オブジェクト参照を32ビット整数プリミティブに変換するように求められたとき、CLRは、その数を使用するコードが符号付きまたは符号なしであると予期しているかどうかを知りませんし、気にしません。コンパイラーが数値が符号付きまたは符号なしであると信じるかどうかは、一般に、コンパイラーがそれを使った演算のために生成する命令に影響しますが、それは言語(CLRではない)の問題です。
スーパーキャット2015年

23

問題の一部は、Cの符号なし整数型が数値ではなく抽象代数環のメンバーとして動作する必要があるという事実に関係していると思います[たとえば、符号なし16ビット整数変数がゼロに等しい場合、デクリメントが必要です65,535を生成し、それが65,535と等しい場合は、ゼロを生成するためにインクリメントする必要があります。]このような動作が非常に役立つ場合がありますが、数値型がこのような動作を示す場合、一部の言語の精神に反する可能性があります。符号なしの型を省略するという決定は、おそらくチェック済みと未チェックの両方の数値コンテキストをサポートするという決定よりも古いと推測します。個人的には、私は符号なしの数と代数環のために別々の整数型があったらいいのにと思います。単項マイナス演算子を符号なし32ビットの数値に適用すると、64ビットの符号付き結果が得られます(ゼロ以外の値を負にすると負の数になります)が、単項マイナスをリングタイプに適用すると、そのリング内に追加の逆が得られます。

いずれにせよ、符号なし整数がCLSに準拠していない理由は、言語が「CLS互換」と見なされるために言語が符号なし整数をサポートする必要がないと判断したためです。


数学的観点からの優れた説明!
dizarter 2015年

6

Unsigned intを使用しても、実際にはそれほど多くは得られませんが、1種類以上のintを使用すると苦痛が生じるため、多くの言語ではintのみを使用しています。

CLS準拠は、クラスが多くの言語から利用できるようにすることを目的としています…

誰もあなたをCLS準拠にしないことを忘れないでください。

CLS準拠が制限するのはパブリックAPIのみであるため、メソッドで、またはプライベートメソッドへのパラメーターとして、未署名の整数を引き続き使用できます。


16
ビット単位の演算を行う場合、これらは非常に重要です。
nicodemus13

@ nicodemus13問題ドメインにビット単位の算術演算があったビジネス管理システムを最後に見たのはいつですか?(例:VB.NETプログラマーが作成する種類のソフトウェア)
Ian Ringrose 2012年

38
チェックサムのあるものはすべてビットワイズ演算を使用しますが、これはかなり一般的です。VBは符号なし整数をサポートしていないため、他のすべての言語を下にドラッグするのは奇妙に思えます。.NETは、LOBアプリのVBライターだけでなく、汎用的なものでもあります。「1種類のint」と言うとき、byte、short、int、longも苦痛だと思いませんか?署名がこれ以上厄介である理由がよくわかりません。
nicodemus13

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.