int转char,无限执行

Converting int to char, infinite execution

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

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 到 char 可以隐式转换,但如果我显式转换它 - 它不起作用,为什么? 或者我理解错了什么?

A char 永远不会等于 -1(它是无符号类型),因此当您输入 -1 并将其转换为 char 时,它变为正数并且循环的结束条件永远不会遇见了

int i = -1;

int i = (char) -1;

不要将相同的值分配给 i

每个 integer 变量所需的 space 是 4 个字节,每个 char 所需的 space只有1个字节。由于这些 space 中的每一个都以 2 的补码表示,因此 char 变量 不能 在它的 space 中保存 -1 (因为它是无符号的)并且它必须保持为正值。因此,最好使用整数值来保持代码逻辑和条件。

根据 Oracle Java doc

char: The char data type is a single 16-bit Unicode character. It has a minimum value of '\u0000' (or 0) and a maximum value of '\uffff' (or 65,535 inclusive).

char 永远不能保持负值。
因此,条件 while (i != -1 && j != -1) 将始终为真,循环将 运行 无限期地进行。


此外,当您尝试将 negative values 分配给 char 时,它会将该值旋转到另一端(最大值)。

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.

另一种证明 ij 永远不会小于 0 并且循环条件总是 true.

的方法