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.
另一种证明 i
和 j
永远不会小于 0
并且循环条件总是 true
.
的方法
我不明白为什么在这种情况下程序可以正常工作:
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.
另一种证明 i
和 j
永远不会小于 0
并且循环条件总是 true
.