考虑以下
public byte GetAByte()
{
return (byte)(_globalByte % 13);
}
请注意,以下操作无效并引发错误。
return (_globalByte % (byte)13);
这里mod运算符返回一个整数,需要将其转换回一个字节以使return语句起作用。如果我错了,请纠正我,但我猜测_globalByte在计算模数之前被转换为整数。总的来说,这意味着2次铸造操作。
所以我的问题是为什么基本运算符每次都必须返回一个整数?这是一个特定于java的怪癖,还是这样做有一些重要性?
答案 0 :(得分:5)
所以我的问题是为什么基本运算符每次都必须返回一个整数?这是一个特定于java的怪癖,还是这样做有一些重要性?
它发生的原因是Java整数算术运算符被定义为int op int -> int
(或long op long -> long
)。
为什么他们这样定义?我不确定,但我可以想到三种可能的解释:
假设+
带有签名byte op byte -> byte
的重载。现在我们遇到+
不再关联的情况。假设我们有byte b1, b2; int i;
然后
(b1 + b2) + i
使用+
运算符执行第一个byte
,然后使用+
运算符执行第二个int
。
b1 + (b2 + i)
使用+
运算符执行第二个int
,然后使用+
运算符执行第一个int
。
请注意,如果按字节b1 + b2
溢出,则评估复合表达式的两种不同方法将为提供不同的答案。
但是自动将操作数扩展到int
并以int op int -> int
进行操作可以避免这种情况。
答案 1 :(得分:0)
发生的事情称为“隐式扩展转换”。
当对两种类型进行操作时,则较低类型被隐式转换为较高类型。因此,当您尝试使用_globalByte
运算符使用int
值13进行操作时,使用隐式转换将modulus
转换为int。