这是一个程序,其中第4行产生编译错误(可能丢失精度,需要char find int
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 char ch = 32;我们在char变量ch中赋值32但不生成任何错误。 我想要这两行之间的区别; char ch = 32且c = i + 1;
答案 0 :(得分:5)
错误的原因是char
是2个字节而int
是4个字节。并且java不会让你进行隐式转换,变量会丢失它的高位。您必须从int
到char
进行明确的演员
在另一个方向上,为“数字”持有者分配int
值将起作用,直到您不尝试分配超出范围的内容。 (在这种情况下超过2 ^ 16-1)
答案 1 :(得分:3)
在这两种情况下,您都要求从签名的32位int
转换为无符号的16位char
。在这一行中,编译器可以确保数字32适合char
:
char ch=32;
在这一行中,编译器只知道您将某些int
值转换为char
,因此它无法确定它是否适合:
c = i + 1;
只要没有100%确定没有精度损失,Java就会坚持使用显式强制转换运算符。
答案 2 :(得分:1)
精度损失意味着INTEGER具有更大的值而CHAR更小,因此您无法适应那个空间大的东西。
这就是你收到错误的原因。
你需要输入INTEGER到CHAR的类型,但仍然会丢失精度,因为你不能将INTEGER拟合到CHAR中,但如果整数值小于损失精度可以忽略。
答案 3 :(得分:1)
不应将转换与转换混淆。在这种情况下,你只是在施法。有些操作有隐式转换,有些则没有。例如=
并非如此,您已指定可以投射。 ++
和+=
进行隐式投射。
e.g。
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.
答案 4 :(得分:0)
使用此:
c = (char) i + 1;
但请确保您的i
处于char
值
答案 5 :(得分:0)
如Character类中所定义,java中的chars是字符的UTF-16表示。所以char
的大小为16位。
在你的第一个作业中,你将32
分配给一个UTF-16字符可以存储为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
答案 6 :(得分:0)
我不确定我明白你想要的是什么......但是:
现在,如果你想要的只是做这种char算术,你可以:
其中一个会起作用,但是,从你展示的片段中,可能会让'我'成为一个更有意义的字符......
答案 7 :(得分:0)
其背后的原因是编译器无法自动将更高的数据类型值转换为更低的数据类型值。
此处int为Higher Datatype,Char为较低的数据类型...
i + 1计算整数结果,该结果不适合char类型..
的图片无法从高到低
可以降低到更高