2

署名されていないデータ型がないというJavaに対する苦情をよく耳にします。たとえば、このコメントを参照してください。これがどのように問題なのか知りたいのですが?私はJavaでプログラミングを10年ほど行っていますが、問題は発生していません。バイトをintに変換するときに& 0xFF必要になることがありますが、それは問題ではないと思います。

符号なし数値と符号付き数値は同じビット値で表されるため、符号が重要な場所は次のとおりです。

  • 数値を他のビット表現に変換する場合。8、16、および32ビット整数型の間で、必要に応じてビットマスクを使用できます。
  • 数値を10進形式、通常は文字列に変換する場合。
  • APIまたはプロトコルを介した非Javaシステムとの相互運用。繰り返しますが、データはほんの少しなので、ここでは問題はわかりません。
  • 数値をメモリまたはその他のオフセットとして使用します。32ビットintの場合、これは非常に大きなオフセットでは問題になる可能性があります。

代わりに、符号なし数値と符号付き数値の間の操作、およびそれらの間の変換を考慮する必要がない方が簡単です。私は何が欠けていますか?プログラミング言語で符号なし型を使用することの実際の利点は何ですか?それらを使用するとJavaがどのように改善されるでしょうか?

4

3 に答える 3

11

時折、バイトを int に変換するときに & 0xFF が必要になりますが、私はそれを問題とは考えていません。

なぜだめですか?「ビットごとの AND を 0xFF に適用する」ことは、実際にコードが表現しようとしているものの一部ですか? そうでない場合、なぜそれを書かなければならないのですか?実際、バイトをある場所から別の場所にコピーするだけでなく、バ​​イトでやりたいことのほとんどは、マスクが必要になることがわかりました。私は自分のコードを無造作にしたいと思っています。符号なしバイトの欠如はこれを妨げます:(

さらに、常に負でない値を返すか、負でない値のみを受け入れるAPI を検討してください。unsigned 型を使用すると、検証を必要とせずに明確に表現できます。個人的には、.NET でunsigned 型が使用されいないのは残念だと思います。String.LengthICollection.Count

Java に署名されていない型がないことは致命的な欠陥ですか? 明らかに違います。迷惑ですか?絶対。

あなたが引用したコメントは頭に釘を打ちます:

Java に符号なしデータ型がないことも、Java の妨げになっています。はい、回避できますが、理想的ではなく、基になるデータを正しく反映していないコードを使用することになります。

符号なし 16 ビット整数を必要とする別のシステムと相互運用していて、数値 65535 を表現したいとします。「データは単なるビットなので、ここでは問題は見られません」と主張しますが、合格する必要があります- 1 は 65535問題であることを意味します。データの表現とその根底にある意味との間のインピーダンスの不一致は、コードの書き込み、読み取り、およびテスト時に余分なスピードバンプをもたらします。

代わりに、符号なし数値と符号付き数値の間の演算とそれらの間の変換を考慮する必要がない方が簡単だと思います。

これらの操作を考慮する必要があるのは、2 つの異なる型 (1 つは符号付き、もう 1 つは符号なし) の値を自然に処理している場合だけです。その時点で、あなたは絶対にその違いを指摘してもらいたいと思っています. 当然のことながら符号なしの値を表すために符号付きの型が使用されているため、違いを考慮する必要がありますが、そうべきであるという事実はあなたから隠されています。検討:

// This should be considered unsigned - so a value of -1 is "really" 65535
short length = /* some value */;
// This is really signed
short foo = /* some value */;

boolean result = foo < length;

fooが 100 で、-1であるとしlengthます。論理的な結果は何ですか?の値は65535 をlength 表すため、論理的fooにはそれより小さくなります。しかし、おそらく上記のコードを使用すると、間違った結果が得られるでしょう。

もちろん、ここで異なる型を表す必要さえありません。どちらも自然に符号なしの値である可能性があり、負の数が正の数よりも論理的に大きい符号付きの値として表されます。同じエラーが適用され、言語に署名されていない型がある場合は問題になりません。

Joshua Bloch とのインタビュー(Google キャッシュ。現在は java.sun.com から削除されていると思われます)もお読みください。

いい質問ですね... Java プラットフォームで最も奇妙な点は、バイト型が署名されていることです。これについての説明は聞いたことがありません。これは非常に直感に反しており、あらゆる種類のエラーを引き起こします。

于 2012-04-05T06:48:58.810 に答える
2

お望みであれば、はい、すべてが 1 と 0 です。ただし、ハードウェアの演算および論理ユニットはそのようには機能しません。ビットを符号付き整数値に格納したいが、符号付き整数には不自然な操作を実行する場合、通常、ストレージ スペースと処理時間の両方が無駄になります。

符号なし整数型は、対応する符号付き整数型と同じスペースに 2 倍の負でない値を格納します。そのため、C で通常使用される POSIX 日付値 (符号なし秒数) など、符号なし値を持つ言語で一般的に使用されるデータを Java に取り込みたい場合は、一般に、より広い整数型を使用する必要があります。 C が使用するよりも。このような値を多数処理している場合は、ストレージ スペースとフェッチ実行時間の両方が無駄になります。

于 2012-04-05T06:58:44.403 に答える
0

私が unsigned データ型を使用したのは、画像に対応する大き​​なデータ ブロックを読み込んだり、openGL を操作したりするときでした。ある種の「安全機能」として、何かが決して否定的ではないことがわかっている場合、私は個人的に署名なしを好みます。

符号なしの型はビットごとの比較に役立ち、グラフィックスで広く使用されていると確信しています。

于 2012-04-05T06:52:57.653 に答える