我正在通过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';
}
是的,有人可以解释刚刚发生在这里的事吗?如何添加,整数中的子字符以及它背后的意义和感谢。
答案 0 :(得分:9)
来自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)。
例如,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
,那么值{{返回的1}}代表33
字符,因为'!'
是其代码点值。在ASCII表或Unicode表中查找字符以验证33
(比较小数值)。
答案 1 :(得分:3)
这是因为char是一种原始类型,可以用作数值。字符串中的每个字符都被编码为一个特定的数字(在所有情况下都不完全正确,但足以基本理解该事项),Java允许您以这种方式使用字符。
它可能允许这主要是出于历史原因,这是它在C中的工作方式,它们可能以“性能”或类似的方式激励它。
如果你认为这很奇怪,那么别担心,我也这么认为
其他答案实际上是不正确的。 ASCII是一种特定的编码(编码是一些规范,表示“1 = A,2 = B,...,255 =空格”)并且不是Java中使用的编码。 Java char是两个字节宽,通过unicode字符编码进行解释。
答案 2 :(得分:2)
Chars反过来存储为整数(ASCII值),以便您可以对整数执行add和sub,这将返回char的ASCII值
答案 3 :(得分:1)
无论Java如何实际存储char
数据类型,可以肯定的是,从字符'A'
中减去的字符'A'
将表示为null
字符, \0
。在内存中,这意味着每个位都是0
。内存中char
占用内存的大小因语言而异,但据我所知,null
字符在所有语言中都是相同的,每个位都等于{{ 1}}。
作为0
值,每个位等于int
的内存表示整数值0.
事实证明,当你进行“字符数学运算”时,从任何其他字母字符(相同的情况)中减去任何字母字符会导致位被翻转,如果你将它们解释为0
表示这些字符之间的距离。此外,从任何其他数字字符中减去char int
将导致从中减去的char的int值,原因基本相同。
'0'