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

时间:2013-09-22 05:17:09

标签: java

考虑以下

public byte GetAByte()
{
    return (byte)(_globalByte % 13);
}

请注意,以下操作无效并引发错误。

    return (_globalByte % (byte)13);

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

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

2 个答案:

答案 0 :(得分: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进行操作可以避免这种情况。

答案 1 :(得分:0)

发生的事情称为“隐式扩展转换”。

当对两种类型进行操作时,则较低类型被隐式转换为较高类型。因此,当您尝试使用_globalByte运算符使用int值13进行操作时,使用隐式转换将modulus转换为int。