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

问题描述 投票:7回答:4

我正在通过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所以有人可以解释刚刚发生在这里的事情吗?如何添加,整数中的子字符以及它背后的含义是什么,谢谢。

java
4个回答
9
投票

来自Docs

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

char由其代码点值表示:

  • min '\u0000'(或0)
  • max:'\uffff'(或65,535)

您可以在ASCII table上查看所有英文字母代码点。

请注意0 == \u000065,535 == \uffff,以及介于两者之间的一切。它们是相应的值。

char实际上只是存储为一个数字(它的代码点值)。我们有语法来表示像char c = 'A';这样的字符,但它相当于char c = 65;'A' == 65是真的。

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

例如,char 'A'由其代码点65(ASCII表中的十进制值)表示:

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)的最大整数值。因此,从(short)char的演员不能总是奏效。并且char的最小整数值是0,而short的最小整数值是-32,768。


对于你的代码,让我们说char'D'。请注意'D' == 68,因为它的代码点是68

return 10 + ch - 'A';

这将返回10 + 68 - 65,因此它将返回13

现在让我们说char是'Q' == 81

if (ch >= 'A' && ch <= 'F')

这是错误的,因为'Q' > 'F'81 > 70),所以它将进入else块并执行:

return ch - '0';

这将返回81 - 48,因此它将返回33

你的函数返回一个int类型,但如果它返回一个char或者之后将int转换为char,那么返回的值33将代表'!'字符,因为33是它的代码点值。在ASCII表或Unicode表中查找字符以验证'!' == 33(比较小数值)。


3
投票

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

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

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

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


2
投票

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


1
投票

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

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

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

'A' - 'A' = '\0'
'a' - 'a' = '\0'
'0' - '0' = '\0'
© www.soinside.com 2019 - 2024. All rights reserved.