Short和Character除了处理之外有什么区别?

时间:2013-01-07 22:08:18

标签: java

据我所知:

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

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

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

编辑:给出答案,我错了: 是Java中的一个无符号基元类型,它是...... char

编辑2 :@ PatriciaShanahan还提到在算术操作中,char的行为类似于无符号16位整数,就像short一样。这包括左移,即符号位 ,就像short一样。

3 个答案:

答案 0 :(得分: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 Language Specification section 4.2表示

  

整数类型为byteshortintlong,其值为8位,16位,32位和64位分别为签名二进制补码整数和char,其值为16位无符号整数,代表UTF-16代码单元

(我的大胆)。它还将类型的范围明确地表示为

  • byte,从-128到127,包括
  • short,从-32768到32767,包括
  • int,从-2147483648到2147483647,包括
  • long,from -9223372036854775808 to 9223372036854775807,included {/ li>
  • char,从'\ u0000'到'\ uffff',包括0到65535

答案 1 :(得分:3)

它们目前不兼容,永远不会改变。但是为了猜测为什么它们最初不同 - 对于数字数据和字母来说,它们可能是一个非常好的想法,即使它们的内容工作方式完全相同,只是为了避免混淆他们。那将是坏。

答案 2 :(得分:0)

关于 short 和 char 的已知事实:

  1. 在没有显式转换的情况下,char 原始变量永远不能分配给 short。

  2. 一个简短的原始变量永远不能在没有显式转换的情况下分配给一个字符。

    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 定义的,只有当值适合一个字符 (0 - 65535) 时才能分配给一个字符,反之亦然。 对于 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