加法和减法字符为什么这有效? (java)

我正在通过Daniel liang在第9章“字符串”的“Java编程第9版介绍”中学习Java我遇到过这段代码:

public static int hexCharToDecimal(char ch){ if (ch >= 'A' && ch <= 'F') return 10 + ch - 'A'; else return ch - '0'; } 

oki所以有人可以解释刚刚发生在这里的事情吗? 如何添加,整数中的子字符以及它背后的含义是什么,谢谢。

关注我对ASCII值的讨论,即使我已经包含了Unicode字符。

来自Docs

char数据类型是单个16位Unicode字符。

char可以表示为:

  • 它的代码点值(Unicode) – min: '\u0000'和max: '\uffff'
  • 其ASCII值 min:0和最大值:65,535(含)

请注意0 == \u000065,535 == \uffff – 以及介于两者之间的所有内容。 它们是相应的值。

在你的代码中,字符由它们的ASCII值表示来进行算术运算(整数从0到65,535)。

例如,char’A 'A'可以用其int(ASCII)值65

 System.out.print('A'); // prints A System.out.print( (int)('A') ) // prints 65 because you casted it to an int 

注意, short是一个16位有符号整数,所以即使char也是16位, char (65,535)的最大整数值超过short (32,767)的最大整数值。 因此,从char(short)并不总是有效。 并且char的最小整数值是0,而short的最小整数值是-32,768。


对于你的代码,让我们说char是'D'

 return 10 + ch - 'A'; 

将返回10 + 68 - 65所以它将返回13

对于所有意图和目的,它将char数据类型“转换”为整数值,然后执行基本算术。 'D' char可以用其整数ASCII值68

让我们说炭是'H'

 if (ch >= 'A' && ch <= 'F') would not be true because `'H'` > `'F'` (72 > 70) 

所以它会

 return ch - '0'; 

这将返回72 - 48所以它将返回24

然后将字符存储为整数(ASCII值),以便您可以对整数执行add和sub,这将返回char的ASCII值

这是因为char是一种原始类型,可以用作数值。 字符串中的每个字符都被编码为一个特定的数字(在所有情况下都不完全正确,但足以基本理解该事项),Java允许您以这种方式使用字符。

它可能允许这主要是出于历史原因,这是它在C中的工作方式,它们可能以“性能”或类似的方式激励它。

如果你认为这很奇怪,那就别担心,我也这么认为

另一个答案实际上是错误的。 ASCII是一种特定的编码(编码是一些规范,表示“1 = A,2 = B,…,255 =空格”)并且不是Java中使用的编码。 Java char是两个字节宽,通过unicode字符编码进行解释。

无论Java如何实际存储char数据类型,可以肯定的是,从字符'A'减去的字符'A'将表示为null字符\0 。 在内存中,这意味着每个位都为0char在内存中占用的内存大小可能因语言而异,但据我所知,所有语言中的null字符都相同,每个位都等于0

作为int值,每个位等于0的一块存储器表示整数值0。

事实certificate,当你进行“字符数学运算”时,从任何其他字母字符(相同的情况)中减去任何字母字符会导致位被翻转,如果你将它们解释为int ,将代表这些角色之间的距离。 此外,从任何其他数字char中减去char’0 '0'将导致从中减去的char '0' int值,原因基本相同。

 'A' - 'A' = '\0' 'a' - 'a' = '\0' '0' - '0' = '\0'