質問
値にLを追加することにより、リテラルのlongを作成できます。同様の方法でリテラルのショートまたはバイトを作成できないのはなぜですか?キャストでintリテラルを使用する必要があるのはなぜですか?
そして、答えが「Cに短いリテラルがなかったから」という場合、なぜCには短いリテラルがないのですか?
これは、実際には私の人生に有意な形で影響を与えるものではありません。 0Sなどの代わりに(短い)0を書き込むのは簡単です。しかし、矛盾があるため、私は好奇心makes盛です。夜遅くに起きたときに気になるのは、これらのことの1つです。ある時点で誰かが、すべてのプリミティブ型ではなく一部のプリミティブ型のリテラルを入力できるようにするという設計上の決定を下しました。なぜですか?
解決
Cでは、少なくとも int
は「自然な」 CPUのワードサイズと long
は、「より自然な」ものであると考えられていました。ワードサイズ(その最後の部分ではわかりませんが、x86で int
と long
が同じサイズである理由も説明します)。
今、私の推測では: int
と long
には、マシンのレジスターに正確に適合する自然な表現があります。ただし、ほとんどのCPUでは、小さなタイプの byte
および short
は、使用する前に int
にパディングする必要があります。その場合は、キャストすることもできます。
他のヒント
「本当に価値を追加しない限り、言語に何も追加しない」というケースだと思います。 -そして、それは価値がないほど十分に小さな価値を追加すると見られていました。あなたが言ったように、それは簡単に回ることができます、そして、率直に言って、それはとにかくほとんど必要ありません(曖昧さ除去のためだけに)。
C#でも同じことが言え、どちらの言語でも特に見逃したことはありません。 Javaで見落としているのは、符号なしバイト型です:)
もう1つの理由は、JVMがショートとバイトを認識していないことです。すべての計算と保存は、JVM内でint、long、float、doubleを使用して行われます。
考慮すべきことがいくつかあります。
1)前述のように、JVMにはbyte型またはshort型の概念はありません。通常、これらのタイプはJVMレベルでの計算には使用されません。したがって、これらのリテラルの使用は少なくなると考えることができます。
2)byte変数とshort変数の初期化では、int式が定数であり、型の許容範囲内にある場合、暗黙的にターゲット型にキャストされます。
3)(short)10
のように、いつでもリテラルをキャストできます