将int转换为char,无限执行

时间:2017-04-15 18:25:54

标签: 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 {
        i =(char) f1.read();
        j =(char) f2.read();
        if (Character.toLowerCase(i) != Character.toLowerCase(j)) break;
    } while (i != -1 && j != -1);

我知道可以隐式转换int到char,但如果我明确地转换它 - 它不起作用,为什么? 或者我理解错了什么?

3 个答案:

答案 0 :(得分:3)

char永远不能等于-1(它是无符号类型),因此当您输入-1并将其强制转换为char时,它变为正数并且循环为&#39 ;结束条件永远不会得到满足。

int i = -1;

int i = (char) -1;

不要为i分配相同的值。

答案 1 :(得分:2)

根据Oracle Java doc

  

char:char数据类型是一个16位Unicode字符。它有   最小值'\ u0000'(或0)和最大值'\ uffff'(或   65,535(含))。

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

此外,当您尝试将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的替代方法。

答案 2 :(得分:0)

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