在没有整数转换的情况下在java中操作整数值?

Tho*_*mas 0 java

考虑以下

public byte GetAByte()
{
    return (byte)(_globalByte % 13);
}
Run Code Online (Sandbox Code Playgroud)

请注意,以下内容不起作用并引发错误.

    return (_globalByte % (byte)13);
Run Code Online (Sandbox Code Playgroud)

这里mod运算符返回一个整数,需要将其转换回一个字节以使return语句起作用.如果我错了,请纠正我,但我猜测_globalByte在计算模数之前被转换为整数.总的来说,这意味着2次铸造操作.

所以我的问题是为什么基本运算符每次都必须返回一个整数?这是一个特定于java的怪癖,还是以这种方式做到这一点有一些重要性?

Ste*_*n C 5

所以我的问题是为什么基本运算符每次都必须返回一个整数?这是一个特定于java的怪癖,还是以这种方式做到这一点有一些重要性?

它发生的原因是Java积分算术运算符被定义为int op int -> int(或long op long -> long).

为什么他们这样定义?我不确定,但我可以想到三种可能的解释:

  • 跨一系列本机指令集/体系结构的高效实现.
  • 与C和C++等其他语言保持一致.(我不是这些语言标准的专家,但我在C99语言规范中找到了这个地方,说明了这一点......第6.3.1.1节第2段.)
  • 数学一致性.

IMO,后者可能是最重要的.

假设+签名过载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可以避免这种情况.