【发布时间】:2015-07-27 09:23:20
【问题描述】:
我遇到了一个java打印字符是ASCII的情况。如果我们尝试打印两个字符,那么它会打印 ASCII 值的总和。
System.out.println('c'); =>> c
System.out.println('a'+'b'); =>> 195 (97+98)
只是想知道为什么在第二种情况下它会打印 ASCII 值的总和
【问题讨论】:
标签: java
我遇到了一个java打印字符是ASCII的情况。如果我们尝试打印两个字符,那么它会打印 ASCII 值的总和。
System.out.println('c'); =>> c
System.out.println('a'+'b'); =>> 195 (97+98)
只是想知道为什么在第二种情况下它会打印 ASCII 值的总和
【问题讨论】:
标签: java
在幕后,char 由 int 表示,因此当您添加 2 个字符时,结果将是一个 int,表示它们的 ASCII 值的总和。
【讨论】:
因为char 也可以被视为int。你实际上在做的只是添加 2 个整数。
在您的第一个示例中,System.out.println('c'); 指的是System.out.println(char);,但在第二个示例中,'a'+'b' 是一个 int,因此您调用的是 System.out.println(int);
要将其输出为字符串,请将其转换为字符串
System.out.println(String.valueOf('c') + String.valueOf('b'));
【讨论】:
Java 不是像 ruby / python 那样完整的 OO 语言。原语是java最重要的部分。 因此,在您的情况下,在第二个语句中,它将仅使用 ascii 操作。 它不会连接字符,也不会传递“ab”。单引号中提到了字符。字符串在双引号内。 如果你通过 "a" + "b" = "ab" 因为在这里你添加了两个字符串而不是一个字符。
【讨论】:
对于字符,使用Ascii 值,即int val。正在计算加法 int val。但是对于下面的情况“a”+“b”,它是 stringBuilder 类,它将连接两个字符串。
System.out.println("a"+"b");--> ab
【讨论】:
StringBuilder 添加"a"+"b"
因为 char(不是 Character)在幕后是一个无符号整数类型。但是,当您添加两个 char 时,您会得到一个 int。
你期待什么?
【讨论】:
在幕后,编译器表现得太聪明了并将char + char替换为一个int 常量值。
在第一种情况下调用println(char),在第二种情况下调用println(int)
示例代码:
public static void main(String[] args) {
System.out.println('a');
System.out.println('a' + 'b'); // the compiler first "resolves" the expression 'a'+'b' (since char cannot be added they are added as ints) and then tries to call the correct `println(int)` method.
}
字节码:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=1, args_size=1
0: getstatic #16 // Field java/lang/System.out:Ljav
/io/PrintStream;
3: bipush 97 // for single char. (pushed a byte as an int)
5: invokevirtual #22 // Method java/io/PrintStream.prin
ln:(C)V
8: getstatic #16 // Field java/lang/System.out:Ljav
/io/PrintStream;
11: sipush 195 // push sum of 2 chars as a short
14: invokevirtual #28 // Method java/io/PrintStream.prin
ln:(I)V
17: return
【讨论】:
ldc 代替sipush :)
Java 使用双引号定义字符串字面量,并使用单引号定义字符字面量 - 所以这个例子将连接两个字符串:
String strA = "a";
String strB = "b";
System.out.println(strA + strB);
..而此示例将打印将 2 个 char 整数值相加的结果:
char charA = 'a';
char charB = 'b';
System.out.println(charA + charB);
【讨论】:
char 的 + 运算符定义为它们的整数值之和,得到一个整数。
因为你问的是ASCII,所以我们必须这样解释总和……
Java char 持有 UTF-16 代码单元值,UTF-16 是 Unicode 的编码,Unicode 是 ASCII 的超集,UTF-16 使用与 ASCII 相同的值对公共子集中的字符进行编码,并且在此代码中,UTF-16 代码单元(两个字节)的大小与 ASCII 代码单元(一个字节)的大小不同并不重要。
因此,当您将两个包含 ASCII 子集中字符的 char 值相加时,总和与将它们的 ASCII 值相加相同。
【讨论】: