为什么 Java 没有像对 int 那样检查 byte 的类型兼容性?
Why Java did not check for type compatibility for byte as it does with int?
我正在尝试使用 byte 作为 for 循环中的控制循环变量。
我将条件用作 n < 128(其中 128 超出字节范围)
for (byte n =0; n < 128 ; n++) System.out.println("I am in For loop. "+ n );
循环从 0 到 127,然后从 -128 到 127 无限循环。
当我尝试对 int 做同样的事情时,它给出了一个错误。
for (int n = 0; n < 2147483648; n++)
int类型的文字2147483648超出范围
为什么 Java 不像检查 int 那样检查与 byte 的类型兼容性?
不根据循环变量的类型检查类型兼容性。
没有后缀的整数文字的类型总是int
。 128
是有效的 int
,因此第一个循环通过了编译,但导致数值溢出,从而导致无限循环。
另一方面,2147483648
不是有效的 int
,因此第二个循环没有通过编译。如果将 2147483648
替换为 long
文字 (2147483648L
),第二个循环也会通过编译。
与 n < 128
进行 int 比较; n 传播到 int。然而,任何字节值作为 int 都小于 128。并且 n++ 溢出。
另一种情况:
n < 2147483648L
会被接受并导致同样的问题。
我正在尝试使用 byte 作为 for 循环中的控制循环变量。 我将条件用作 n < 128(其中 128 超出字节范围)
for (byte n =0; n < 128 ; n++) System.out.println("I am in For loop. "+ n );
循环从 0 到 127,然后从 -128 到 127 无限循环。
当我尝试对 int 做同样的事情时,它给出了一个错误。
for (int n = 0; n < 2147483648; n++)
int类型的文字2147483648超出范围
为什么 Java 不像检查 int 那样检查与 byte 的类型兼容性?
不根据循环变量的类型检查类型兼容性。
没有后缀的整数文字的类型总是int
。 128
是有效的 int
,因此第一个循环通过了编译,但导致数值溢出,从而导致无限循环。
另一方面,2147483648
不是有效的 int
,因此第二个循环没有通过编译。如果将 2147483648
替换为 long
文字 (2147483648L
),第二个循环也会通过编译。
与 n < 128
进行 int 比较; n 传播到 int。然而,任何字节值作为 int 都小于 128。并且 n++ 溢出。
另一种情况:
n < 2147483648L
会被接受并导致同样的问题。