在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