Java 除了处理外,短字符和字符有什么区别?

Java 除了处理外,短字符和字符有什么区别?,java,Java,据我所知: “bytewise”,看起来它们是一样的(它们都有2个字节长) 然而,字符对它有更多的处理(static.isleter()方法和其他方法,等等) 虽然我的问题听起来很愚蠢,但它们是: 除非我的第一个假设是错误的,为什么会有原语类型char和short,因为它们具有相同的“内部长度”,而且Java中没有无符号的原语类型 Short是final,如果不是,字符是否可以扩展Short EDIT:给出了答案,但我错了:Java中有一个未签名的基元类型,那就是……char 编辑2:@

据我所知:

  • “bytewise”,看起来它们是一样的(它们都有2个字节长)
  • 然而,
    字符
    对它有更多的处理(static
    .isleter()
    方法和其他方法,等等)
虽然我的问题听起来很愚蠢,但它们是:

  • 除非我的第一个假设是错误的,为什么会有原语类型
    char
    short
    ,因为它们具有相同的“内部长度”,而且Java中没有无符号的原语类型
  • Short
    final
    ,如果不是,字符
    是否可以扩展
    Short
EDIT:给出了答案,但我错了:Java中有一个未签名的基元类型,那就是……
char


编辑2:@PatriciaShanahan还提到,在算术运算中,
char
的行为类似于无符号16位整数,就像
short
。这包括左移,也就是说,符号位被携带,就像
short

一样,它们当前是不兼容的,而且永远不会兼容改变了。但是为了猜测它们最初的不同之处——对于数字数据和字母使用不同的类型可能是一个非常好的主意,即使它们的内容工作方式完全相同,只是为了避免混淆。那将是很糟糕的。

本质的区别是
short
是有符号的,
char
是u未签名

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
国家

整数类型有
字节
整数
,其值分别为8位、16位、32位和64位有符号两位补整数和
字符
,其值为16位无符号整数,表示UTF-16码单元

(我的粗体)。它还明确给出了类型的范围

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

关于short和char的事实有待了解:

  • 如果没有显式强制转换,char基元变量永远不能分配给short

    char c = 'c';
    short s = c; // will cause a compiler error
    
    short sh = 10;
    char ch = sh; // will also cause a compiler error
    
  • 在没有显式强制转换的情况下,不能将短基元变量指定给char

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

     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
    
    
    
     
    

    这可能会有一些启示:对于无符号原语,您也忘记了
    boolean
    @MarkoTopolnik不太清楚,
    boolean
    在Java中根本不是数字类型(它不能转换为任何数字类型,反之亦然),因此符号/无符号的区别不适用。char表示两个字符中的任何一个(不仅仅是信件)或数字,具体取决于它的使用方式。作为算术表达式中的操作数,它是一个无符号16位整数。@PatriciaShanahan有趣的观察!嗯,不。Java中没有无符号基元类型。除非你的意思是什么?+1用于将
    char
    正确识别为无符号基元类型。@fge是wro这里是ng。+1
    char
    s的范围从0到65535,而
    short
    s的范围从-32768到-32767。我见过“无无符号基元类型”的概念“最近在Java中有好几次,尽管有明显的反例char。也许@fge可以澄清它来自何处。我不知道它来自何处,但我知道向他们指出它不正确的地方。:
    整数类型[include]char,其值是表示UTF-16代码单位的16位无符号整数。
    奇怪的是,(我已经测试过了,评论者是对的),@PatriciaShanahan提到在算术运算中,
    char
    的行为基本上类似于
    short
    char
    在内部有多特殊?一点也不特殊,因为
    short
    char
    上的算术实际上都是
    int
    算术。它只是在内部将它们都提升到
    int
    。好吧,那么处理方法真的取决于JVM,除了算术运算?我的意思是,
    字符
    对显示等有特殊的规则,但将其留给JVM核心来进行算术运算?当然
    char
    是一种基本类型,
    Character
    与所有包装类型一样,只是围绕其相应的基本类型的一个非常非常简单的包装。