为啥Java没有检查字节的类型兼容性,因为它死于int?

Posted

技术标签:

【中文标题】为啥Java没有检查字节的类型兼容性,因为它死于int?【英文标题】:Why Java did not check for Type compatibility for byte as it dies with int?为什么Java没有检查字节的类型兼容性,因为它死于int? 【发布时间】:2018-03-27 14:59:31 【问题描述】:

我正在尝试在 for 循环中使用字节作为控制循环变量。 我使用条件为 n

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 的类型兼容性?

【问题讨论】:

【参考方案1】:

不根据循环变量的类型检查类型兼容性。

不带后缀的整型字面量的类型始终为int128 是一个有效的int,因此第一个循环通过了编译,但导致数值溢出导致无限循环。

另一方面,2147483648 不是有效的int,因此第二个循环没有通过编译。如果将 2147483648 替换为 long 文字 (2147483648L),则第二个循环也将通过编译。

【讨论】:

【参考方案2】:

n &lt; 128 int 比较发生; n 被传播到一个 int。但是任何字节值作为 int 都小于 128。并且 n++ 溢出。

另一种情况:

n < 2147483648L

会被接受并导致同样的问题。

【讨论】:

以上是关于为啥Java没有检查字节的类型兼容性,因为它死于int?的主要内容,如果未能解决你的问题,请参考以下文章

为啥C语言中bool型变量占用一个字节

Google-App-Engine 上的 Grails - 它死了吗? [关闭]

在 linux 上查找泄漏的替代 valgrind (memcheck)? [关闭]

Java - 为啥没有基于返回类型的方法重载?

为啥方案没有原始 c 数据类型,如 int、float 等

Facebook 选项卡应用程序无法访问粉丝专页的照片