是真的,Java将原始类型加法(如字节+短)结果转换为整数?Java是否总是将加法结果转换为int?
回答
我怀疑你在说的是promotion。它并不像往常一样简单。有关详细的原始加宽,但这里Section 5.1.2会谈有一些指引:
- 如果结果分配给一个变量,然后它会被晋升为变量的类型(如果可能)
- 比较有限类型将被提升到了更广阔的类型
- 一个结果可以,如果它很可能是大于类型将处理
就像我说的,这是实际的规则,简化获得提升,但一般Java做正确的事情。
Java语言规范(JLS)的以下部分都适用:
5.6节数值促销)“数值提升施加到算术运算符的操作数”
节5.6.2.2二进制数字推广)“... ...如果任一操作数的类型是double ... long ... float ...否则两个操作数都转换为int类型”
因此,在你的byte + short的例子中,首先被转换为整数。
为了进一步说明:
short a = 1;
short b = 2;
short c = a + b;
将产生一个编译错误 “需要短,实测值INT”。 你需要投加(一个int)的结果为短,像这样:
short c = (short) (a + b);
您需要了解参数的推广和铸造概念。 Java只能评估具有相同类型值的表达式。例如,如果你有表达式a = b + c;那么a和b和c必须具有相同的类型。你现在可能会想知道如何在不出现任何错误的情况下添加整数和双精度。这是类型提升的概念被Java隐式应用的地方。在这种情况下,你的整数变量隐含地改变为仅用于执行你的操作的double(记住你的整型变量的类型不改变,只为你的表达式做双重拷贝)。
现在重点是,只有在变量的数据没有丢失的情况下,java才隐式使用类型提升。例如,如果将整数更改为double,则不会丢失任何数据。但如果你想改变让我们说一个值为1.2的双变量为整数,那么你将失去小数部分。这是java不会应用类型提升的地方,您需要手动进行类型转换。基本上什么类型的转换意味着要控制编译器,并告诉编译器,我知道我可能会在我的变量中丢失一些数据,但没关系,并为我执行投射。 类型提升和投射发生在表达式和方法调用中。 下表显示了java将自动执行的有效促销活动。
类型 有效促进
双 无
浮动 双
长 浮点或双精度
INT 长,浮动或双
炭 整型,长整型,浮点或者双倍勒
短 整型,长整型,浮点或双(但不是char)
字节 短型,整型,长整型,浮点或双(但不是char)
布尔值 无(布尔值不被视为java中的数字)
- 1. 是否将char *转换为int * undefined?
- 2. 将LINQ查询结果转换为int
- 3. 它是否有可能会将int *转换为unsigned int *
- 4. 将int转换为字节 - Java和Actionscript中的不同结果
- 5. java - 无法将整数转换为int
- 6. 将double转换为int(java)
- 7. Java将String []转换为int []
- 8. java将int转换为short
- 9. 将int转换为char,然后返回int - 并不总是给出相同的结果
- 10. datamapper是否将SGBD结果转换为对象?
- 11. 将short转换为char是否合法?
- 12. 是否将int转换为一个计为Autoboxing的字符串?
- 13. 将int转换为英寸并将结果显示为回显
- 14. 转换的MySQL结果为int(C++)
- 15. java转换为int
- 16. 是否有可能将int转换为自定义类类型(在java中)?如果是,那么如何?
- 17. C2440无法将int转换为int&
- 18. iOS将NSString转换为NSDate总是零
- 19. 如何将maskedtextbox值转换为int,如果它是空的?
- 20. 是否有内置的例程将lightuserdata转换为int?
- 21. 在Win64下将SOCKET强制转换为int是否安全?
- 22. 是否有任何函数在PHP中将long转换为int?
- 23. 总是转换为对象
- 24. 确定CTLine是否为换行结果
- 25. 将结果转换为值
- 26. 将Iteratee转换为结果
- 27. 将[Int?]转换为[Int]
- 28. 将int转换为int []
- 29. 将IO Int转换为Int
- 30. 的Java:问题在转换的指数值的结果为int