7

据我所知:

  • “按字节”,看起来它们是相同的(它们都是 2 个字节长);
  • Character,但是,对它有更多的处理(静态.isLetter()方法和其他方法等)。

虽然我的问题可能听起来很愚蠢,但它们是:

  • 除非我的第一个假设是错误的,否则为什么会有原始类型char并且short因为它们具有相同的“内部长度”,而且无论如何,Java 中没有无符号原始类型?
  • Shortfinal,如果不是,可以Character延长Short吗?

编辑:给出的答案,我错了:Java中有一种无符号的原始类型,那就是char......

编辑 2:@PatriciaShanahan 还提到在算术运算中, a 的char行为类似于无符号 16 位整数,就像 a 一样short。这包括左移,即带符号位就像 for 一样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节指出

整数类型分别为byteshortintlong,其值分别为 8 位、16 位、32 位和 64 位有符号二进制补码整数,以及,其值为代表 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 回答
0

关于 short 和 char 要知道的事实:

  1. 如果没有显式强制转换,永远不能将 char 原始变量分配给 short。

  2. 如果没有显式转换,永远不能将短原始变量分配给 char。

    char c = 'c';
    short s = c; // will cause a compiler error
    
    short sh = 10;
    char ch = sh; // will also cause a compiler error
    
  3. 只有当值适合 char (0 - 65535) 时,才能将使用关键字 final 定义的短常量分配给 char,反之亦然。对于 item1 和 item2 中的示例。下面修复错误。

     final char c = 'c';
     short s = c; // compiles without any issues.
    
     final short sh = 10;
     char ch = sh; // compiles without any issues.
    

但是,下面失败了,因为 char 是无符号的,即只能处理正文字。

     final short sh = -1;
     char ch = sh; // compiler error is thrown

要修复错误,需要一个明确的案例。

     final short sh = -1;
     char ch = (char)sh; // compiler error is thrown



 
于 2021-04-30T08:51:13.413 回答