Java-char,int转换

Java-char,int转换,java,char,type-conversion,int,variable-assignment,Java,Char,Type Conversion,Int,Variable Assignment,在Java中,允许以下情况: char c = 'A' + 1; 这里,c将保存值“B”。在上面,首先计算表达式。所以“A”被转换为65,整个表达式的计算结果为66,然后66被转换为“B”,因为我们将值存储在一个字符中 但是,下面给出了一个编译时错误: char c = 'A'; c = c + 1; 对于Java如何以不同的方式看待表达式,有什么解释呢?顺便说一句,以下几点也可以: char c = 'A'; c++; 字符到整数的转换称为加宽转换。在加宽转换中,值不会丢失有关数值的总体

在Java中,允许以下情况:

char c = 'A' + 1;
这里,c将保存值“B”。在上面,首先计算表达式。所以“A”被转换为65,整个表达式的计算结果为66,然后66被转换为“B”,因为我们将值存储在一个字符中

但是,下面给出了一个编译时错误:

char c = 'A';
c = c + 1;
对于Java如何以不同的方式看待表达式,有什么解释呢?顺便说一句,以下几点也可以:

char c = 'A';
c++;

字符到整数的转换称为加宽转换。在加宽转换中,值不会丢失有关数值的总体大小的信息,其中as int-to-char转换称为缩小转换。使用窄化转换时,可能会丢失有关数值整体大小的信息,也可能会丢失精度


有关原语转换的更多信息,请参阅文档。

这是因为编译器可以检查它
('A'+1)
是否在字符的范围内,而(通常)它不能检查
c+
是否在范围内。

第一个示例(编译)是特殊的,因为加法的两个操作数都是文字

首先有几个定义:

  • int
    转换为
    char
    称为a,因为
    char
    的类型小于
    int

  • 'A'+1
    是一个。常量表达式(基本上)是一个其结果始终相同且可在编译时确定的表达式。特别是,
    'A'+1
    是一个常量表达式,因为
    +
    的操作数都是文本

:

此外,如果表达式[右侧]是类型为
byte
short
char
int
的常量表达式:

  • 如果变量的类型为
    byte
    short
    char
    ,并且常量表达式的值可以用变量的类型表示,则可以使用缩小原语转换
c+1
不是一个常量表达式,因为
c
是一个非
final
变量,因此赋值会发生编译时错误。通过查看代码,我们可以确定结果总是相同的,但在这种情况下编译器不允许这样做

我们可以做的一件有趣的事情是:

final char a = 'a';
char b = a + 1;
在这种情况下,
a+1
是一个常量表达式,因为
a
是一个用常量表达式初始化的
final
变量

警告“如果[…]值[…]在变量类型中是可表示的”,则表示以下内容不会编译:

char c = 'A' + 99999;
'A'+99999
(即
100064
,或
0x186E0
)的值太大,无法放入
字符中,因为


:

后缀增量表达式的类型是变量的类型

在加法之前,对值
1
和变量值执行二进制数字提升*如有必要,在存储变量之前,通过缩小原语转换缩小和/或对变量类型进行装箱转换

(*获取诸如
+
等运算符的
字节
字符
操作数,并将它们转换为
int
或其他更大的类型。)

换句话说,语句
c++主要相当于:

c = (char)(c + 1);
(不同之处在于,如果我们将表达式
c++
赋给某个对象,则该表达式的结果是增量之前
c
的值。)

其他增量和减量的规格非常相似


,因此也允许使用诸如
c+=1
(甚至
c+=3.14
)之类的表达式。

这是因为整数或小于int的文本作为byte、short和char是int。以这种方式理解以下内容

代码:

  byte a = 10;//compile fine
  byte b= 11;//compile fine
  byte c = a+b;//compiler error[says that result of **a+b** is **int**]
“除”、“乘”和其他算术运算的任何数学运算也会发生同样的情况。因此,强制转换结果以获得所需数据类型中的文本

byte c = (byte)(a+b);
所以当你表演的时候

   c= c+1;//compiler error
c+1的结果是int而不是char。所以编译器会给同样的代码一个编译时错误。 因此,您需要提供一个基本类型转换来将文本更改为char数据类型。
希望这个例子能提供一些理解。

请看一下下面的问题,特别是Targetman的回答:我不确定66转换为“B”是否准确。字符基本上已经是数字了。@Piovezan这是一个有趣的点,尽管它的整数范围也是如此。对于文字,字符文字(“B”)总是char类型,当然66总是int类型。也许最准确的说法是将其转换为“\u0042”(一种总是char类型的数字代码)。这是一个很好的问题,我以前没有看到过这样的问题。真棒的问题。我想Java应用这个规则的原因是因为(正如Brian所说)Java无法决定整数是否在这个范围内。基本上是的。缩小转换范围意味着可能存在溢出,Java希望这种可能性是明确的。您可以随时执行类似于char c=(char)('A'+99999)的操作