【问题标题】:How numeric promotion and demotion works for literals and variables in Java? [duplicate]Java中的文字和变量如何进行数字提升和降级? [复制]
【发布时间】:2021-04-11 20:39:15
【问题描述】:

我不确定我的问题是否足够清楚,所以我会举例说明。假设我们有下一个表达式:

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 是一个 double,但为什么不能将其“降级”为 float 并强制我们将字面量声明为 float 12.0F?我知道这将代表信息的丢失。但是,将整数转换为短字节或字节也代表丢失了信息,不是吗?

最后,为什么我们可以将整型字面量赋给 short 或 byte 类型的变量...

 short a = 10;
 byte b = 12;

但我们不能将整数作为参数传递给需要短/字节参数的方法?

public void newMethod(short x, byte y){
    ...
}

。 . .

newMethod(10, 2)

如果您可以搜索一些我可以阅读此类内容的链接,那就太好了(因为我不确定如何搜索我遇​​到的这些特定问题)。

提前谢谢大家。

【问题讨论】:

  • 编译器可以确定文字值在适当的范围内。一旦将值分配给int 类型的变量,它就无法再检查了。
  • @ElliottFrisch 所以你基本上是说,一旦我用一个变量包装一个文字,编译器就无法确定该文字的值是否超过(比如说)一个字节或一个短的范围?跨度>
  • @YuliyaSheludyakova 是的,它实际上澄清了几乎所有事情。我仍然不明白为什么不能将int(例如10)类型的文字(不是变量)传递给需要byteshortchar 参数的方法。
  • @DamianGDO 编译器非常好。但他们没有感觉。您不要用变量包装文字,而是为变量赋值。 int a = 100;100 分配给 a。合法的。 byte b = a; - 将变量 aint)中的值分配给 byte b - 编译器不会假定这是一个有效的赋值(除非你告诉它)。 byte b = (byte) a;(嘿,我是开发人员。我知道这很安全)。

标签: java variables type-conversion literals type-promotion


【解决方案1】:

您可以查看以下两个链接:

顺便说一句,这两个问题都得到了 StackOverflow 贡献者排名第一的 Jon Skeet 的回答 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2018-10-12
    • 2021-06-09
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 2015-09-03
    相关资源
    最近更新 更多