在Java中,两个字符相加的结果是int还是char?
当添加在Java中,两个字符相加的结果是int还是char?,java,char,int,primitive,addition,Java,Char,Int,Primitive,Addition,当添加'a'+'b'时,它产生195。输出数据类型是char还是int?对char和byte(和short)的二进制算术运算升级为int——JLS 5.6.2。根据,如果两个操作数都不是双精度、浮点或长精度,则都升级为int。但是,我强烈建议不要将字符类型视为数字类型,这样做有违其目的。添加Java字符、短字符或字节的结果是一个int: : 如果任何操作数为引用类型,则取消装箱转换 (§5.1.8)的规定。然后: 如果任一操作数的类型为double,则 另一个转换为双精度 否则,如果任一操作数
'a'+'b'
时,它产生195。输出数据类型是char
还是int
?对char
和byte
(和short
)的二进制算术运算升级为int
——JLS 5.6.2。根据,如果两个操作数都不是双精度、浮点或长精度,则都升级为int。但是,我强烈建议不要将字符类型视为数字类型,这样做有违其目的。添加Java字符、短字符或字节的结果是一个int:
:
- 如果任何操作数为引用类型,则取消装箱转换 (§5.1.8)的规定。然后:
- 如果任一操作数的类型为double,则 另一个转换为双精度
- 否则,如果任一操作数的类型为 浮动,另一个转换为浮动
- 否则,如果任一操作数 为long类型,另一个转换为long
- 否则,两者 操作数转换为int类型
char x = 1, y = 2;
x = x + y; // compile error: "possible loss of precision (found int, required char)"
x = (char)(x + y); // explicit cast back to char; OK
x += y; // compound operation-assignment; also OK
通常,您可以找到结果类型的一种方法是将其强制转换为对象,并询问它是什么类:
System.out.println(((Object)('a' + 'b')).getClass());
// outputs: class java.lang.Integer
若您对性能感兴趣,请注意,甚至并没有针对较小数据类型的算术的专用指令。例如,对于添加,有指令iadd
(用于整数),ladd
(用于长整数),fadd
(用于浮点数),dadd
(用于双倍整数),仅此而已。要用较小的类型模拟x+=y
,编译器将使用iadd
,然后使用类似i2c
(“int-To-char”)的指令将int的高位字节归零。如果本机CPU有针对1字节或2字节数据的专用指令,则由Java虚拟机在运行时对此进行优化
如果您想将字符连接为字符串,而不是将其解释为数字类型,有很多方法可以做到这一点。最简单的方法是向表达式中添加一个空字符串,因为添加一个字符和一个字符串会导致一个字符串。所有这些表达式都会产生字符串“ab”
:
'a'+'+'b'
(这是因为首先计算“+”a“+”b“
;如果“+”a“
在末尾,则会得到”
)“195”
新字符串(新字符[]{'a','b'})
new StringBuilder().append('a').append('b').toString()
String.format(“%c%c”,“a”,“b”)
char
的以下表达式
char c='A';
int i=c+1;
System.out.println("i = "+i);
这在Java中完全有效,并返回66
,即c+1
字符(Unicode)的对应值
这在Java中非常有效,字符串类型变量
temp
自动接受char类型的c
,并在控制台上生成temp=A
以下所有语句在Java中也是有效的
Integer intType=new Integer(c);
System.out.println("intType = "+intType);
Double doubleType=new Double(c);
System.out.println("doubleType = "+doubleType);
Float floatType=new Float(c);
System.out.println("floatType = "+floatType);
BigDecimal decimalType=new BigDecimal(c);
System.out.println("decimalType = "+decimalType);
Long longType=new Long(c);
System.out.println("longType = "+longType);
尽管c
是char
的一种类型,但是在相应的构造函数中可以提供它,并且不会出错,并且上述所有语句都被视为有效语句。它们分别产生以下输出
intType = 65
doubleType = 65.0
floatType = 65.0
decimalType = 65
longType =65
char
是一种基本的数字整数类型,因此受这些野兽的所有规则的约束,包括转换和升级。你会想了解这一点,JLS是最好的来源之一:。特别是,请阅读“5.1.2基本体转换”中的简短部分。Java编译器可以将其解释为任意一个
通过编写程序并查找编译器错误来检查:
public static void main(String[] args) {
int result1 = 'a' + 'b';
char result2 = 'a' + 'b';
}
如果是char,那么第一行会给我一个错误,第二行不会。
如果是int,则会发生相反的情况
我编译了它,我得到了。。。。。没有错误因此Java接受这两者。
然而,当我打印它们时,我得到:
内部:195
查尔:Ã
发生的情况是,当您执行以下操作时:
char result2 = 'a' + 'b'
执行隐式转换(从int到char的“原语缩小转换”)虽然您已经有了正确的答案(在JLS中引用),但这里有一些代码来验证您在添加两个
char
时是否得到了int
public class CharAdditionTest
{
public static void main(String args[])
{
char a = 'a';
char b = 'b';
Object obj = a + b;
System.out.println(obj.getClass().getName());
}
}
输出是
java.lang.Integer
表示为值,其中Unicode值由\u
后跟值表示
与对char
值执行的任何算术运算升级为int
,因此'a'+'b'
的结果计算为
1.)使用在相应的char
上应用Unicode
值
2.)应用转换,然后对十进制值执行操作
char Unicode Decimal
a 0061 97
b 0062 98 +
195
范例
0061
(0*163)+(0*162)+(6*161)+
(1*160)
(0*4096)+(0*256)+(6*16)+(1*1)
0+0+96+1=97
(0*163)+(0*162)+(6*161)+
(2*160)
(0*4096)+(0*256)+(6*16)+(2*1)
0+0+96+2=98
因此97+98=195
例2
char Unicode Decimal
Ջ 054b 1355
À 00c0 192
--------
1547 +
1163 -
7 /
260160 *
11 %
虽然这是正确的,但当常量表达式出现在赋值上下文中时,存在一个复杂的情况
考虑以下示例:
char x = 'a' + 'b'; // OK
char y = 'a';
char z = y + 'b'; // Compilation error
发生了什么事?他们的意思是一样的,不是吗?在第一个例子中,为什么将int
赋值给char
是合法的
当常量表达式出现在赋值上下文中时,Java编译器计算表达式的值,并查看它是否在您要赋值的类型的范围内。如果是,则为隐式narro
char Unicode Decimal
Ջ 054b 1355
À 00c0 192
--------
1547 +
1163 -
7 /
260160 *
11 %
char x = 'a' + 'b'; // OK
char y = 'a';
char z = y + 'b'; // Compilation error