这是一个程序,其中第4行生成编译错误(可能丢失精度,需要在中查找字符
public class test {
public static void main(String args[]) {
char c;
int i;
c = 'A'; // 1
char ch=32; //2
i = c; //3
c = i + 1; //4
c++; //5
}
}
在第2行中,字符ch=32;我们在一个char变量ch中分配了一个值32,但没有产生任何错误。我想要这两行之间的区别;char ch=32并且c=i+1;
错误的原因是char
为2字节,int
为4字节。java不允许在变量会丢失其高位的地方进行隐式强制转换。您必须进行从int
到char
的显式强制转换
在另一个方向上,将int
值分配给"数字"持有者将起作用,直到您不尝试分配超出范围的值为止。(在这种情况下超过2^16-1)
在这两种情况下,您都请求从有符号的32位int
转换为无符号的16位char
。在这一行中,编译器可以确保数字32适合char
:
char ch=32;
在这一行中,编译器只知道你正在将某个int
值转换为char
,所以它不确定它是否适合:
c = i + 1;
Java坚持使用显式强制转换运算符,只要不能100%确定不会损失精度。
精度损失意味着INTEGER的值较大,而CHAR较小,因此无法容纳该空间中过大的值。
这就是为什么你会犯那个错误。
您需要将INTEGER强制转换为CHAR,但精度仍然会丢失,因为您无法将INTEGOR放入CHAR,但是如果整数值小于丢失精度,则可以忽略。
=
没有,所以您必须指定可以进行投射。CCD_ 12和CCD_。
例如
char ch = '0';
char ch2 = 2; // implicit casting
ch *= 1.1; // implicit casting
ch2++; // no casting required.
ch2 += 1; // implicit casting.
ch2 = ch2 + 1; // won't compile, casting required.
使用此:
c = (char) i + 1;
但请确保您的i
在char
值的范围内
我不确定我是否理解你想要的是什么。。。。但是:
- 第2行之所以有效,是因为文字数字"32"可以用2字节的字符表示
- 第4行失败了,因为它说,如果您试图将一个4字节的值(int)分配给一个2字节的位置(char),它需要强制转换
现在,如果你只想做这种字符运算,你可以:
- 把"i"变成一个字符
- 在第4行添加强制转换
两者中的一个会起作用,但从您显示的片段来看,可能将"i"作为字符更有意义。。。。
其背后的原因是编译器无法自动将较高的数据类型值转换为较低的数据类型。。
这里int是Higher Datatype,Char是lower Datatype。。。
i+1计算为整数结果,该结果不能放入char类型中。。
用于数据类型自动转换的图像
从高到低是不可能的
可能从低到高
根据Character类中的定义,java中的字符是字符的UTF-16表示。因此CCD_ 16的大小为16位。
在第一个赋值中,您将32
(可以存储在16位中)赋值给一个UTF-16字符,所以这很好。
但是,当您尝试将任何类型的int转换为i
时,您将从32位数据转换为16位数据,这是一个不可能隐含的操作。
short a = 32; // fine
short b = 3243334; // can't compile
char c = 32; // fine
char d = 3243334; // can't compile