这行Java代码在做什么? 请考虑一下这个java代码。它是有效的,但我正在努力理解它的作用 char str = 'foo' long prime = 503; long hash = 0; hash = prime + str.charAt(1);
我很困惑,因为这是不同数据类型的数学加法。如果我认为为了这个数学运算的目的,字符被转换为ASCII值,那么我是否正确这行Java代码在做什么? 请考虑一下这个java代码。它是有效的,但我正在努力理解它的作用 char str = 'foo' long prime = 503; long hash = 0; hash = prime + str.charAt(1);,java,types,charat,Java,Types,Charat,我很困惑,因为这是不同数据类型的数学加法。如果我认为为了这个数学运算的目的,字符被转换为ASCII值,那么我是否正确 谢谢 首先,您的语法错误。我纠正了这一点(见下面的代码)。现在,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
谢谢 首先,您的语法错误。我纠正了这一点(见下面的代码)。现在,
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并运行代码以查看输出
编辑
正如@Henry所指出的,字符的值在Java中不仅限于ASCII值。因此,这里使用的更好的术语是Unicode代码点,而不是ASCII值。要了解更多详细信息,请参阅是。根据将加法操作+
应用于long
和char
时,将对char
执行“加宽原语转换”,并使用两个long
值执行加法
如果我认为该角色已转换为其角色,我是否正确 用于此数学运算的ASCII值 是(除非您需要将第一行更改为
String str=“foo”
。char
基本上是一种整数类型,可以在算术表达式中使用
Javadoc说:
charAt
公共字符(整数索引)
返回当前位置的char值
指定的索引
JLS(Java语言规范)规定:
第4章类型、值和变量
数字类型是
整型byte
,short
,int
,long
和char
及
4.2.基本类型和值:
char
,其值是表示UTF-16的16位无符号整数
代码单位(§3.1)”
及
4.2.1.积分类型和值
对于字符,从'\u0000'
到'\uffff'
包括在内,即从0
到65535
及
5.6.2.二进制数字升级
当运算符将二进制数字提升应用于一对操作数(每个操作数必须表示可转换为数字类型的值)时,以下规则依次适用:
加宽基元转换(§5.1.2)用于转换以下规则指定的一个或两个操作数:
…如果其中一个操作数的类型为long,则另一个操作数将转换为long
及
15.18.2.数字类型的加法运算符(+和-)
二进制+运算符应用于两个数字类型的操作数时执行加法,生成操作数之和
对操作数执行二进制数字提升(§5.6.2)
“如果我认为字符被转换为ASCII值用于此数学运算,我是否正确?“字符是一种数字数据类型,没有转换。该代码的可能副本将无法编译。
str
必须是字符串,而不是char
您的第一行char str='foo';
没有意义。您的意思可能是String str=“foo”
@DyZ这并不是这个问题的重复:这里没有字符串连接。一种稍微不同的说法是,char
和long
实际上不是不同的类型。它们都是整数。所以就像你可以把int
和byte
加在一起一样(byte被加宽为int)您可以添加一个int
和一个long
(int被加宽为long),这样您就可以将char
添加到其他类型的整数中。(整数可以转换为浮点,这样您就可以将它们添加到char
和其他整数中。)我将在这里吹响自己的号角,并添加一个指向我回答的另一个问题的链接,该问题涉及char
类型的算术:您缺少非常重要的:“char
,其值是表示UTF-16代码单位(§3.1)”的16位无符号整数,以真正回答关于“ASCII值”的问题@andreas这是4.2.1中的隐式,但好吧,我添加了它。严格地说,它不是ASCII值,而是字符的Unicode代码点(只要它在BMP中)。两者在ASCII范围内一致,但Java中可以使用更多字符。实际上,它是UTF-16代码单元,其中一个或两个组成Unicode代码点。请尝试String foo=”