【发布时间】:2016-02-17 18:13:37
【问题描述】:
java将原始类型加法(如byte+short)结果转换为整数是真的吗?
【问题讨论】:
java将原始类型加法(如byte+short)结果转换为整数是真的吗?
【问题讨论】:
我怀疑你说的是promotion。它并不像总是提升为 int 那样简单。 Section 5.1.2 详细讨论了原始扩展,但这里有一些指导方针:
就像我说的那样,这是对实际规则的简化,但总的来说 Java 做的是正确的事情。
【讨论】:
Java 语言规范 (JLS) 的以下部分适用:
第 5.6 节数字提升)“数字提升应用于算术运算符的操作数”
Section 5.6.2.2 Binary Numeric Promotion) "...如果任一操作数的类型为 double...long...float...否则两个操作数都转换为 int 类型"
因此,在您的 byte + short 示例中,操作数将首先被转换为整数。
进一步说明:
short a = 1;
short b = 2;
short c = a + b;
会产生一个编译错误“required short, found int”。 您需要将加法的结果(一个 int)转换为一个短整数,如下所示:
short c = (short) (a + b);
【讨论】:
您需要了解参数提升和强制转换概念。 Java 只能评估具有相同类型值的表达式。例如,如果您有表达式 a = b + c;那么 a 和 b 和 c 必须具有相同的类型。您现在可能想知道如何将整数和双精度数相加而不会出错。这是Java隐式应用类型提升概念的地方。在这种情况下,您的整数变量被隐式更改为 double 仅用于执行您的操作(请记住,您的整数变量的类型不会更改,只会为您的表达式制作双份副本)。
现在的重点是,如果变量的数据没有丢失,java 只会隐式使用类型提升。例如,如果您将整数更改为双精度,您将不会丢失任何数据。但是,如果您想将值 1.2 的双精度变量更改为整数,那么您将丢失小数部分。这是 java 不会应用类型提升的地方,您需要手动进行类型转换。基本上,类型转换的意思是控制编译器并告诉编译器我知道我可能会丢失变量中的一些数据,但没关系并为我执行转换。 类型提升和强制转换发生在表达式和方法调用中。 下表显示了 java 会自动执行的有效促销活动。
输入 有效促销
双 无
浮动 双
long float 或 double
int long、float 或 double
char int、long、float 或 double
short int、long、float 或 double(但不是 char)
字节 short、int、long、float 或 double(但不是 char)
boolean None(布尔值在 java 中不被视为数字)
【讨论】: