0

这是一个程序,其中第 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 个字符 ch=32;我们在 char 变量 ch 中分配了一个值 32,但没有产生任何错误。我想要这两条线之间的区别;字符 ch=32 和 c=i+1;

4

8 回答 8

5

错误的原因char是 2 字节和int4 字节。而且java不会让你在变量会丢失它的高位的地方进行隐式转换。您必须从 to 进行显式int转换char
在另一个方向上,将int值分配给“数字”持有者将起作用,直到您不尝试分配超出范围的内容。(在这种情况下超过 2^16-1)

于 2012-08-31T09:55:45.057 回答
3

在这两种情况下,您都请求将有符号的 32 位int转换为无符号的 16 位char。在这一行中,编译器可以确保数字 32 适合char

char ch=32;

在这一行中,编译器只知道您正在将某个int值转换为 a char,因此它不确定它是否适合:

c = i + 1;

每当不能 100% 确定不会有精度损失时,Java 都会坚持使用显式强制转换运算符。

于 2012-08-31T09:57:46.843 回答
1

精度损失意味着 INTEGER 具有较大的值,而 CHAR 较小,因此您无法容纳对于该空间来说太大的东西。

这就是您收到该错误的原因。

您需要将 INTEGER 类型转换为 CHAR 但仍然会丢失精度,因为您无法将 INTEGER 放入 CHAR 但如果整数值小于损失精度可以忽略。

于 2012-08-31T09:59:16.550 回答
1

转换不应与强制转换相混淆。在这种情况下,您只是在投射。一些操作具有隐式转换,而另一些则没有。例如=,您没有指定您可以投射。++并进行+=隐式转换。

例如

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.
于 2012-08-31T09:59:56.110 回答
0

其背后的原因是编译器无法自动将较高的数据类型值转换为较低的数据类型值。

这里 int 是更高的数据类型,而 Char 是更低的数据类型......

i+1 计算为整数结果,它不适合 char 类型。

数据类型自动转换的图像

从高到低是不可能的

从低到高是可能的

于 2012-08-31T10:04:25.757 回答
0

用这个:

c = (char) i + 1;

但请确保您在值i范围内char

于 2012-08-31T09:55:23.960 回答
0

正如Character类中所定义的,java 中的 chars 是字符的 UTF-16 表示。因此char,大小为 16 位。

在您的第一个作业中,您将32可以存储为 16 位的 UTF-16 字符分配给 UTF-16 字符,这样就可以了。

但是,当您尝试将任何类型的 int asi转换为 32 位数据时,您正在从 32 位数据转换为 16 位数据,这是一个不能隐含的操作。

short a = 32; // fine 
short b = 3243334; // can't compile
char c = 32; // fine
char d = 3243334; // can't compile
于 2012-08-31T09:57:31.823 回答
0

我不确定我是否了解您想要什么....但是:

  • 第 2 行有效,因为文字数字 '32' 可以用 char 的 2 字节表示
  • 第 4 行失败,因为它表示如果您尝试将 4 字节值 (int) 分配给 2 字节位置 (char),则需要强制转换。

现在,如果你想要的只是做这种 char 算术,你可以:

  • 使“我”成为一个字符。
  • 将演员表添加到第 4 行。

两者中的一个将起作用,但是,从您显示的片段中,可能使 'i' 成为一个字符更有意义....

于 2012-08-31T10:00:36.110 回答