7

私が知っていることについて:

  • 「バイト単位」では、同じように見えます(どちらも2バイトの長さです)。
  • Characterただし、より多くの処理があります(静的.isLetter()メソッドなど)。

私の質問はばかげているように聞こえるかもしれませんが、ここにあります:

  • 私の最初の仮定が間違っていない限り、なぜプリミティブ型がcharありshort、それらは同じ「内部長さ」を持ち、とにかく、Javaには符号なしプリミティブ型がないのでしょうか。
  • Shortもしそうでfinalなかったら、Character延長できたShortだろうか?

編集:答えが出て、私は間違っていました:Javaに署名されていないプリミティブ型が1つあり、それは...ですchar

編集2:@PatriciaShanahanは、算術演算では、のcharように符号なし16ビット整数のように動作することにも言及していshortます。そして、これには左シフトが含まれます。つまり、の場合と同様に、符号ビット引き継がれshortます。

4

3 に答える 3

20

本質的な違いは、short署名されているものと署名されていないものcharです。

public class CharVsShort {
  public static void main(String[] args) throws Exception {
    short ffShort = (short)0xFFFF;
    char ffChar = (char)0xFFFF;

    System.out.println("all-1s-short = " + (int)ffShort);
    System.out.println("all-1s-char  = " + (int)ffChar);
  }
}

版画

all-1s-short = -1
all-1s-char  = 65535

Java 言語仕様のセクション 4.2 には、次のように記載されています。

整数型はbyteshortint、およびlongで、値はそれぞれ 8 ビット、16 ビット、32 ビット、および 64 ビットの符号付き2 の補数整数であり、値はUTF-16 コードを表すchar16 ビットの符号なし整数です。単位

(太字)。また、型の範囲を次のように明示的に指定します。

  • byte、-128 から 127 まで (両端を含む)
  • short、-32768 ~ 32767 (両端を含む)
  • int、-2147483648 から 2147483647 まで (両端を含む)
  • long-9223372036854775808 から 9223372036854775807 まで
  • char、'\u0000' から '\uffff' まで、つまり 0 から 65535 まで
于 2013-01-07T22:10:33.983 に答える
3

それらは現在互換性がなく、変更することはできません。しかし、なぜそれらがもともと異なっていたのかを推測すると、数値データと文字のタイプが異なっていても、それらの内容がまったく同じように機能する場合でも、混同を避けるために異なるタイプを使用することはおそらく非常に良い考えです。それは悪いでしょう。

于 2013-01-07T22:10:04.160 に答える