Java 将int转换为char,无限执行

Java 将int转换为char,无限执行,java,char,infinite,type-conversion,Java,Char,Infinite,Type Conversion,我不明白为什么在这种情况下程序工作正常: do { i = f1.read(); // i is integer j = f2.read(); // j is integer if (Character.toLowerCase(i) != Character.toLowerCase(j)) break; } while (i != -1 && j != -1); 但在这种情况下,程序将无限期地执行: do {

我不明白为什么在这种情况下程序工作正常:

do {
        i = f1.read(); // i is integer
        j = f2.read(); // j is integer
        if (Character.toLowerCase(i) != Character.toLowerCase(j)) break;
    } while (i != -1 && j != -1);
但在这种情况下,程序将无限期地执行:

do {
        i =(char) f1.read();
        j =(char) f2.read();
        if (Character.toLowerCase(i) != Character.toLowerCase(j)) break;
    } while (i != -1 && j != -1);
我知道int-to-char可以隐式转换,但如果我显式转换,它就不起作用了,为什么? 还是我理解错了

字符永远不能等于-1,因为它是无符号类型,所以当您输入-1并将其强制转换为char时,它将变为正数,并且循环的结束条件永远不会满足

i、 e

不要将相同的值赋给i。

字符永远不能等于-1,因为它是无符号类型,所以当您输入-1并将其强制转换为char时,它将变为正值,并且循环的结束条件永远不会满足

i、 e


不要将相同的值分配给i。

每个整数变量所需的空间为4字节,每个字符所需的空间仅为1字节。由于这些空间中的每一个都用2的补码表示,char变量不能在其空间中保留-1,因为它是无符号的,并且必须将is作为正值保留。因此,最好使用整数值保留代码逻辑和条件。

每个整变量所需的空间为4字节,每个字符所需的空间仅为1字节。由于这些空间中的每一个都用2的补码表示,char变量不能在其空间中保留-1,因为它是无符号的,并且必须将is作为正值保留。因此,最好使用整数值保留代码逻辑和条件。

与Oracle Java一致

char:char数据类型是单个16位Unicode字符。它有 最小值'\u0000'或0,最大值'\uffff'或 包括65535人

char永远不能保存负值。 因此,当我-1&j!=-1将始终为真,循环将无限期运行

此外,当您尝试为字符指定负值时,它将通过另一端旋转该值

证明i和j永远不小于0且循环条件始终为真的另一种方法。

根据Oracle Java

char:char数据类型是单个16位Unicode字符。它有 最小值'\u0000'或0,最大值'\uffff'或 包括65535人

char永远不能保存负值。 因此,当我-1&j!=-1将始终为真,循环将无限期运行

此外,当您尝试为字符指定负值时,它将通过另一端旋转该值


证明i和j永远不小于0且循环条件始终为真的另一种方法。

Euh您可以比较i!=-while循环中的1。但是我是一个char…请提供一个例子来演示这个行为。还要注意的是,问题不是无限执行——这只是while循环的一个特性。如果存在的话,问题只是你看到了角色行为的不同。toLowerCase.Euh你比较我!=-while循环中的1。但是我是一个char…请提供一个例子来演示这个行为。还要注意的是,问题不是无限执行——这只是while循环的一个特性。如果一个字符存在的话,问题只是你看到Character.toLowerCase的行为有差异。char是两个字节,而不是一个。@JacobG。我相信这取决于字符编码类型。我用Java开发了一些android应用程序,我遇到了这个问题。我使用UTF-8编码,它是1字节大。但是我想你有一个很好的理由这么说。字符本身可以是一个字节大,但是Java使用UTF-16作为其默认编码,因此每个字符有两个字节。默认情况下,当JDK 9切换到UTF-8时,这将在JDK 9中发生变化。字符是两个字节,而不是一个。@JacobG。我相信这取决于字符编码类型。我用Java开发了一些android应用程序,我遇到了这个问题。我使用UTF-8编码,它是1字节大。但是我想你有一个很好的理由这么说。字符本身可以是一个字节大,但是Java使用UTF-16作为其默认编码,因此每个字符有两个字节。默认情况下,当JDK9切换到UTF-8时,这将在JDK9中发生变化。
int i = -1;
int i = (char) -1;
char c;
c = (char) 65;    // 'A'
c = (char) -100;  // 'ワ' and it results in 65,535(inclusive) - 100 = (char) 65,436
c = (char) 65436; // 'ワ'

int i;
i = (char) 65;    // 65
i = (char) -1;    // 65535 : notice how the char value cycles through the other end
i = (char) -100;  // 65436 : same as (char) -100. Here, int returns 65,436.