Java 中的数字提升和降级如何用于文字和变量?
How numeric promotion and demotion works for literals and variables in Java?
我不确定我的问题是否足够清楚,所以我将举例说明。假设我们有下一个表达式:
byte byteNumber = 10 * 10;
我知道字面数字 10
默认是一个整数,所以表达式 10 * 10
也会产生一个整数,但是 Java 将它“降级”为一个字节值,因为变量(存储结果的地方)是一个字节。
但是,为什么这会有所不同?
int x = 10;
int y = 10;
byte byteNumber = x * y;
行字节 byteNumber = x * y;
被标记为错误。我理解表达式 x * y
会产生一个整数,但不会像文字那样“降级”。即使只有一个变量,如 x * 10
,结果也不会降级。为什么呢?我相信它与变量类型有关,但默认情况下文字是整数,它们可以“降级”。
我正在努力的另一个例子是:我们可以将整数文字分配给 byte、short 或 char 类型的变量,并且 Java 会自动将整数转换为我们声明的变量类型,例如:
short a = 10;
byte b = 12;
另一方面,为什么我们不能做这样的事情呢?
float c = 12.0;
是的,12.0
是一个双精度数,但为什么不能将它“降级”为浮点数并强制我们将字面量声明为浮点数 12.0F
?我知道这将代表信息丢失。但是,将整数转换为短整型或字节也代表信息丢失,不是吗?
最后,为什么我们可以将整型字面量赋值给 short 或 byte 类型的变量...
short a = 10;
byte b = 12;
但是我们不能将整数作为参数传递给需要 short/byte 参数的方法?
public void newMethod(short x, byte y){
...
}
。
.
.
newMethod(10, 2)
如果你能搜索一些我可以阅读此类内容的链接,那就太好了(因为我不太确定如何搜索我遇到的这些具体问题)。
提前谢谢大家。
您可以查看以下两个链接:
- 为什么从 double 到 float 需要显式类型转换而不是从 int 到 byte?
(我已经在评论中分享过)
顺便说一句,这两个问题都由 #1 Whosebug 贡献者 Jon Skeet 回答了:)
我不确定我的问题是否足够清楚,所以我将举例说明。假设我们有下一个表达式:
byte byteNumber = 10 * 10;
我知道字面数字 10
默认是一个整数,所以表达式 10 * 10
也会产生一个整数,但是 Java 将它“降级”为一个字节值,因为变量(存储结果的地方)是一个字节。
但是,为什么这会有所不同?
int x = 10;
int y = 10;
byte byteNumber = x * y;
行字节 byteNumber = x * y;
被标记为错误。我理解表达式 x * y
会产生一个整数,但不会像文字那样“降级”。即使只有一个变量,如 x * 10
,结果也不会降级。为什么呢?我相信它与变量类型有关,但默认情况下文字是整数,它们可以“降级”。
我正在努力的另一个例子是:我们可以将整数文字分配给 byte、short 或 char 类型的变量,并且 Java 会自动将整数转换为我们声明的变量类型,例如:
short a = 10;
byte b = 12;
另一方面,为什么我们不能做这样的事情呢?
float c = 12.0;
是的,12.0
是一个双精度数,但为什么不能将它“降级”为浮点数并强制我们将字面量声明为浮点数 12.0F
?我知道这将代表信息丢失。但是,将整数转换为短整型或字节也代表信息丢失,不是吗?
最后,为什么我们可以将整型字面量赋值给 short 或 byte 类型的变量...
short a = 10;
byte b = 12;
但是我们不能将整数作为参数传递给需要 short/byte 参数的方法?
public void newMethod(short x, byte y){
...
}
。 . .
newMethod(10, 2)
如果你能搜索一些我可以阅读此类内容的链接,那就太好了(因为我不太确定如何搜索我遇到的这些具体问题)。
提前谢谢大家。
您可以查看以下两个链接:
- 为什么从 double 到 float 需要显式类型转换而不是从 int 到 byte? (我已经在评论中分享过)
顺便说一句,这两个问题都由 #1 Whosebug 贡献者 Jon Skeet 回答了:)