【问题标题】:Converting int to char, infinite execution将int转换为char,无限执行
【发布时间】:2017-09-11 18:52:45
【问题描述】:

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

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

【问题讨论】:

  • 呃,你在while 循环中比较i != -1。但是ichar...
  • 请提供一个 minimal test-case 来演示该行为。
  • 还要注意,问题不在于“无限执行”——这只是您的 while 循环的一个特性。问题(如果存在的话)只是您发现Character.toLowerCase 的行为有所不同。

标签: java char infinite type-conversion


【解决方案1】:

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

int i = -1;

int i = (char) -1;

不要将相同的值分配给i

【讨论】:

    【解决方案2】:

    根据 Oracle Java doc

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

    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 的替代方法。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • A char 是两个字节,而不是一个。
      • @JacobG。我相信这取决于字符编码类型。我正在使用 Java 开发一些 android 应用程序,我遇到了这个问题。我使用了 UTF-8 编码,它有 1 字节 大。但我想你有充分的理由这么说。
      • 字符本身可以是一个字节大,但是 Java 使用 UTF-16 作为其默认编码,因此每个char 两个字节。当默认情况下切换到 UTF-8 时,这将在 JDK 9 中发生变化。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 2013-10-31
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      相关资源
      最近更新 更多