为什么Char实际上是Java中的NumericType,而不是SymbolicType或String?

时间:2015-08-17 12:46:51

标签: java

关于Java语法,NumericTypeIntegralTypeFloatingPointType组成。 IntegralTypes为byteshortintlongchar

同时,我可以为char变量分配一个字符。

char c1 = 10;
char c2 = 'c';

所以这是我的问题。为什么char是数字类型以及JVM如何转换' c'一个数字?

4 个答案:

答案 0 :(得分:3)

  

为什么char是数字类型...

使用数字将字符表示为表中的索引是在计算机中处理文本的标准方式。它被称为character encoding并且历史悠久,至少可以追溯到电报。很长一段时间,个人计算机使用ASCII(7位编码= 127个字符加nul)然后"扩展ASCII" (各种形式的8位编码,其中"上部" 128个字符有各种解释),但这些现在已经过时,仅适用于利基目的,这要归功于它们有限的字符集。在个人计算机之前,流行的是EBCDIC及其前身BCD。现代系统使用Unicode(通常通过存储其transformations中的一个或多个,如UTF-8或UTF-16)或各种标准化的代码页"例如Windows-1252ISO-8859-1

  

......以及JVM如何转换' c'一个数字?

Java numeric char values通过Unicode映射到字符和从字符映射(这是JVM知道'c'是值0x0063,或'é'是0x00E9的方式)。具体来说,char值映射到 Unicode代码点,字符串为sequences of code points

char数据类型有很多,包括JavaDoc of the Character class中<16}的值为16位的原因:

  

Unicode字符表示

     

char数据类型(以及Character对象封装的值)基于原始Unicode规范,该规范将字符定义为固定宽度的16位实体。此后,Unicode标准已更改为允许表示形式需要16位以上的字符。合法代码点的范围现在是U + 0000到U + 10FFFF,称为Unicode标量值。 (请参阅Unicode标准中U + n表示法的定义。)

     

从U + 0000到U + FFFF的字符集有时被称为基本多语言平面(BMP)。代码点大于U + FFFF的字符称为增补字符。 Java平台在char数组和String和StringBuffer类中使用UTF-16表示。在此表示中,补充字符表示为一对char值,第一个来自高代理范围(\ uD800- \ uDBFF),第二个来自低代理范围(\ uDC00- \ uDFFF)。

     

因此,char值表示基本多语言平面(BMP)代码点,包括代理代码点或UTF-16编码的代码单元。 int值表示所有Unicode代码点,包括补充代码点。 int的较低(最低有效)21位用于表示Unicode代码点,而较高(最高有效)11位必须为零。除非另有说明,否则关于补充字符和代理字符值的行为如下:

     
      
  • 仅接受char值的方法不支持增补字符。它们将代理范围中的char值视为未定义的字符。例如,Character.isLetter(&#39; \ uD840&#39;)返回false,即使此字符串中的任何低代理值后面的特定值也代表一个字母。

  •   
  • 接受int值的方法支持所有Unicode字符,包括补充字符。例如,Character.isLetter(0x2F81A)返回true,因为代码点值表示一个字母(CJK表意文字)。

  •   
     

在Java SE API文档中,Unicode代码点用于U + 0000和U + 10FFFF之间的字符值,Unicode代码单元用于16位字符值,这些值是UTF的代码单元16编码。有关Unicode术语的更多信息,请参阅Unicode术语表。

答案 1 :(得分:0)

因为Java下面将字符表示为Unicode。这有一些方便,例如你可以从A&#39; A&#39;到了&#39; Z&#39;做点什么然而,重要的是要认识到,在Java字符串中并不是严格的字符数组,就像它们在其他语言中一样。更多信息here

答案 2 :(得分:0)

内部char存储为ASCII(或UNICODE)代码,它是整数。区别在于从内存中读取后的处理方式。

在C / C ++中,charint非常接近,并且是隐式输入的类型。 Java中的类似行为显示了C / C ++和Java之间的关系,因为JVM是用C / C ++编写的。

答案 3 :(得分:0)

除了能够对chars进行算术运算(有时候会很方便)(比如c >= 'a' && c <= 'z')我会说这是一个由Java发明时用其他语言采用的类似方法驱动的设计决策(主要是C和C ++) )。

Character不扩展Number(与其他数字原语包装器一样)这一事实表明Java设计者试图在字符的数字和非数字性质之间找到某种折衷方案。

免责声明我无法找到任何关于此的官方文档。