请考虑这段Java代码。它有效,但我试图了解它的作用。
char str = 'foo'
long prime = 503;
long hash = 0;
hash = prime + str.charAt(1);
我感到困惑,因为这是不同数据类型的数学加法。如果我认为为了这个数学运算的目的而将字符转换为ASCII值,我会是正确的吗?
谢谢!
答案 0 :(得分:6)
首先,你的语法错了。我更正了(见下面的代码)。现在hash
的值将为614.因为hash = prime + str.charAt(1)
表示您要在str的索引1处添加字符的ASCII值,即o
。 o
的ASCII值为111
。因此,添加后hash
的值为614。
String str = "foo";
long prime = 503;
long hash = 0;
hash = prime + str.charAt(1);
System.out.println(hash); // This line prints 614. Because value prime is 503 and the ASCII value of `o` is 111.
您可以使用此Ideone https://ideone.com/EcbP8x并运行代码以查看输出。
修改
正如@Henry指出的那样,字符的值不仅限于Java中的ASCII值。因此,这里使用的更好的术语是Unicode代码点而不是ASCII值。要了解更多详情,请参阅What's the difference between ASCII and Unicode?
答案 1 :(得分:4)
是。根据{{3}},当您将加法操作+
应用于long
和char
时,"加宽基元转换"将在char
上执行,并且将使用两个long
值执行添加。
答案 2 :(得分:2)
如果我认为角色被转换为它,我会是正确的 用于此数学运算的ASCII值?
是(除非您需要将第一行更改为String str = "foo";
。基本上char
是一种可用于算术表达式的整数类型。
Javadoc说:
charAt
public char charAt(int index)
返回的char值 指定的索引。
JLS(Java语言规范)说:
第4章类型,值和变量
数字类型是 整数类型
byte
,short
,int
,long
和char
和
<强> 4.2。原始类型和值:
char
,其值为16位无符号整数,表示UTF-16 代码单元(§3.1)“
和
<强> 4.2.1。积分类型和值
对于char,从
'\u0000'
到'\uffff'
,包括0
到65535
和
<强> 5.6.2。二进制数字促销
当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则适用:
...
应用扩展基元转换(第5.1.2节)来转换以下规则指定的一个或两个操作数:
...如果任一操作数的类型为long,则另一个操作数转换为long。
和
<强> 15.18.2。数字类型的加法运算符(+和 - )
二进制+运算符在应用于两个数值类型的操作数时执行加法,产生操作数的总和。
对操作数执行二进制数字提升(第5.6.2节)。