【发布时间】:2020-07-24 02:31:31
【问题描述】:
Java 运算符是否返回 int 类型?
short a = 1;
short b = 2;
short c = a&b;
short d = a+b;
long e = a&b;
如果是“c”、“d”,它们会出现类型不匹配错误。为什么? 'e' 的情况下没有错误。为什么??
【问题讨论】:
标签: java
Java 运算符是否返回 int 类型?
short a = 1;
short b = 2;
short c = a&b;
short d = a+b;
long e = a&b;
如果是“c”、“d”,它们会出现类型不匹配错误。为什么? 'e' 的情况下没有错误。为什么??
【问题讨论】:
标签: java
您看到的是二进制数字提升。这是在 Java 语言规范§5.6.2 中指定的:
当一个运算符将二进制数字提升应用于一对 操作数,每个操作数必须表示一个可转换为 数字类型,按顺序适用以下规则:
如果任何操作数属于引用类型,则将对其进行拆箱转换(第 5.1.8 节)。
加宽原语转换(第 5.1.2 节)适用于转换以下规则中指定的一个或两个操作数:
如果任一操作数是 double 类型,则另一个将转换为 double。
否则,如果任一操作数为浮点型,则将另一个转换为浮点型。
否则,如果任一操作数为 long 类型,则将另一个转换为 long。
否则,两个操作数都转换为 int 类型。
然后继续列出适用的运算符,我不会在这里引用。
在所有情况下,两个操作数都是short,因此根据最后一个项目符号,它们都转换为int。一个int 加上一个int 是另一个int,它不能隐式转换为short。因此c 和d 中的错误。不过,int 可以隐式转换为long,因此e 不会出错。
【讨论】:
两个小于 int 的整数类型变量之间的任何运算都会产生 int。所以:
short + short -> int
short + byte -> int
等等。 Java Language Specification中提到过。
因此,您必须将 a + b 的结果转换为 short 以便将其分配回 short 类型的变量。请注意,这样做可能会丢失数据。
但是long 大于int。分配是有效的。
【讨论】: