2

我对 Java 中的 byte 和 char 感到困惑。我有以下程序段:

    byte b = 65;
    char c = 65;
    short s = 65;
    System.out.println("b:"+b+" c:"+c+ " s:"+s);  // outputs b:65 c:A s:65

b、c 和 s 的位表示相同,它们都是 :: 00000000 01000001 。我的问题是,如果这些位相同,那么它们的行为方式有何不同 - b 作为字节,c 作为 char 和 s 作为短?另一个问题是:char c = 65;为什么这是一个正确的说法?尽管我将 int 值分配给 char,但它不会给出错误。

谢谢。

4

5 回答 5

4

他们的行为有何不同?

参考JLS

整数类型为 byte、short、int 和 long,其值分别为 8 位、16 位、32 位和 64 位有符号二进制补码整数,以及 char,其值为 16 位无符号整数表示 UTF-16 代码单元。

整数类型的值是以下范围内的整数:

  1. 对于字节,从 -128 到 127(含)

  2. 简而言之,从 -32768 到 32767,包括

  3. 对于 int,从 -2147483648 到 2147483647,包括

  4. 长期,从-9223372036854775808到9223372036854775807,包括

  5. 对于 char,从 '\u0000' 到 '\uffff' 包括在内,即从 0 到 65535

另一个区别是它们的包装类不同:byteto BytechartoCharactershortto Short

char c = 65;为什么这是一个正确的陈述?

char,其值为 16 位无符号整数,表示 UTF-16 代码单元(第 3.1 节)。

于 2013-06-18T10:21:44.323 回答
3

byte装箱到Byte

char装箱到Character

short装箱到Short

这 3 个类有 3 种不同的toString()方法。这就是为什么他们有不同的显示。

然后自动为您完成从intbyte的转换char,然后将其装箱到相应的拳击等级。short

于 2013-06-18T10:23:04.070 回答
2

1)它们的位表示不一样,它是01000001字节和0000000001000001short和char。

2) 区别在于 byte 和 short 是有符号整数,而 char 是 16 位 Unicode 字符

3) 65 不是 int,它是一个常数,如果你尝试分配一个 int,你会得到一个错误

   int x = 65;
   char c = x;   <-- error
于 2013-06-18T10:28:57.277 回答
1

所有原始类型( boolean, char, short, int, ...) 实际上都是内存中的位数组。

变量的类型只定义了这个变量可以取值的范围:

  • boolean1 位 [范围 0-1]
  • char16 位 [范围 0 到 216-1 或 \u0000 到 \uFFFF]
  • byte8 位 [范围 -128 到 127]
  • short16 位 [-32768 到 32767]
  • int32 位 [-2147483648 到 2147483647]
  • ...

char由位或互补的十六进制、十进制、八进制数表示。不要紧。这就是为什么您可以为其分配一个数字,并且该数字与该数字的Unicode表示相匹配。

于 2013-06-18T10:26:03.263 回答
1

就数据表示而言,它们的行为并没有什么不同,不同之处仅在于它们可以在不同的时间间隔内保存值。

至于 char 每个字符都有它的整数表示,这就是为什么它是 java 中的有效语法。

于 2013-06-18T10:21:52.480 回答