web-dev-qa-db-ja.com

Javaにバイトリテラルまたはショートリテラルがないのはなぜですか?

値にLを追加することで、リテラルlongを作成できます。同様の方法でリテラルのショートまたはバイトを作成できないのはなぜですか?キャストでintリテラルを使用する必要があるのはなぜですか?

そして、答えが「Cに短いリテラルがなかったので」である場合、なぜCに短いリテラルがないのですか?

これは実際には意味のある方法で私の人生に影響を与えません。 0Sなどの代わりに(短い)0を書くのは簡単です。しかし、矛盾は私を興味深くさせます。夜遅くまで起きているときに気になることの1つです。ある時点で誰かが、すべてではなく一部のプリミティブ型にリテラルを入力できるようにする設計上の決定を下しました。どうして?

53
Will Wagner

Cでは、少なくともintはCPUの「自然な」Wordサイズを意味し、longはおそらく「より大きな自然な」Wordサイズを意味していました(最後の部分ではわかりません)。 、ただし、intlongがx86で同じサイズである理由も説明します。

さて、私の推測では、intlongには、マシンのレジスタに正確に適合する自然な表現があります。ただし、ほとんどのCPUでは、小さいタイプのbyteおよびshortは、使用する前にintにパディングする必要があります。その場合は、キャストも可能です。

15
Julien Oster

それは「本当に価値を追加しない限り、言語に何も追加しないでください」のケースであると私は思います-そしてそれは価値がないほど十分に少ない価値を追加すると見なされました。あなたが言ったように、ラウンドするのは簡単で、率直に言って、とにかくそれがめったに必要となることはありません(曖昧さをなくすためだけに)。

同じことがC#にも当てはまり、どちらの言語でも特に見逃したことはありません。 Javaは符号なしバイトタイプです:)

8
Jon Skeet

もう1つの理由は、JVMがshortとbyteを認識していないことである可能性があります。すべての計算と保存は、JVM内のint、long、float、doubleで行われます。

4
Joachim Sauer

考慮すべきことがいくつかあります。

1)上で説明したように、JVMにはバイト型やショート型の概念はありません。通常、これらのタイプはJVMレベルでの計算には使用されません。したがって、これらのリテラルの使用は少なくなると考えることができます。

2)バイト変数とショート変数の初期化の場合、int式が定数であり、型の許容範囲内にある場合は、暗黙的にターゲット型にキャストされます。

3)いつでもリテラルをキャストできます。例(short)1

2