首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型推广Java

类型推广Java
EN

Stack Overflow用户
提问于 2015-06-26 15:05:37
回答 2查看 370关注 0票数 4

我正在用Herbert的书学习Java : Java入门指南。在这本书中,出现了这样的代码:

代码语言:javascript
复制
// A promotion surprise!
class PromDemo{
    public static void main(String args[]){
        byte b;
        int i;
        b = 10;
        i = b * b;      // OK, no cast needed

        b = 10;
        b = (byte) (b * b);     // cast needed!!

        System.out.println("i and b: " + i + " " + b);
    }
}

我不明白为什么我必须在行中使用(字节):

代码语言:javascript
复制
b = (byte) (b * b);     // cast needed!!

B被定义为一个字节,b*b的结果是100,这是一个字节的正确值(-128.127)。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-26 15:12:53

JLS (5.6.2.二进制数字提升)给出了将数字类型与二进制运算符(如乘法运算符(*))组合的规则:

  • 如果其中一个操作数为double类型,则另一个操作数将转换为double。
  • 否则,如果其中一个操作数是浮点数类型,则另一个操作数将被转换为浮点数。
  • 否则,如果任一操作数类型为long,则另一个操作数将转换为long。
  • 否则,两个操作数都将转换为int。

最后一点适用于您的情况,字节被转换为ints,然后乘以。

票数 7
EN

Stack Overflow用户

发布于 2015-06-26 15:10:55

在Java中,当有这样的计算时,字节和短将总是被提升为int:

代码语言:javascript
复制
byte b = 10;
b = (byte) (b * b);

因此,您实际上将一个整数乘以一个整数,它将返回一个整数。由于不能将整数赋值给字节,所以需要转换。

这被称为“自动类型推广”,如果你想谷歌它(查找例如https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31076537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档