除了处理之外,Short和Character的区别是什么?



据我所知:

  • " bytes - wise",看起来它们是相同的(它们都是2字节长);
  • Character有更多的处理(静态.isLetter()方法等)。

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

  • 除非我的第一个假设是错误的,为什么有基本类型charshort,因为它们具有相同的"内部长度",无论如何,在Java中没有无符号基本类型?
  • Shortfinal,如果不是,Character会扩展Short吗?

EDIT:给出的答案和我错了:在Java中一种无符号基本类型,这是…char .

EDIT 2: @PatriciaShanahan还提到,在算术操作中,char的行为就像一个无符号16位整数,就像short一样。这包括左移,也就是说,符号位,就像short一样。

区别在于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位有符号双补整数;char的值为16位无符号整数,表示UTF-16编码单元

(我的大胆的)。它还显式地给出了类型的范围

  • byte,从-128到127,包括
  • short,从-32768到32767,包括
  • int,从-2147483648到2147483647,包括
  • long,从-9223372036854775808到9223372036854775807,含
  • char,从'u0000'到'uffff'包括在内,即从0到65535

它们目前是不兼容的,这是永远无法改变的。但是要猜测为什么它们最初是不同的—对于数值数据和字母有不同的类型可能是一个好主意,即使它们的内容以完全相同的方式工作,只是为了避免混淆它们。

关于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. 用关键字final定义的短常量只有在值适合char(0 - 65535)时才能赋值给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

要修复这个错误,需要一个显式的case。

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

 

最新更新