来自Docs
char 数据类型是单个 16 位 Unicode 字符。
char 由其代码点值表示:
- 分钟
'\u0000'(或0)
- 最大值:
'\uffff'(或 65,535)
您可以在ASCII table 上看到所有英文字母代码点。
请注意0 == \u0000 和65,535 == \uffff,以及介于两者之间的所有内容。它们是对应的值。
char 实际上只是存储为一个数字(其代码点值)。我们有语法来表示像char c = 'A'; 这样的字符,但它等价于char c = 65; 并且'A' == 65 是真的。
因此,在您的代码中,字符由它们的十进制值表示以进行算术运算(从 0 到 65,535 的整数)。
例如,字符 '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 位,@987654337 的最大整数值@ (65,535) 超过了 short (32,767) 的最大整数值。因此,从char 转换为(short) 并不总是有效。并且char 的最小整数值为0,而short 的最小整数值为-32,768。
对于您的代码,假设char 是'D'。注意'D' == 68,因为它的代码点是68。
return 10 + ch - 'A';
这会返回10 + 68 - 65,所以它会返回13。
现在假设字符是'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(比较十进制值)。