代码之家  ›  专栏  ›  技术社区  ›  flodin

为什么Java中短整数除法的结果类型不是短整数?

  •  11
  • flodin  · 技术社区  · 16 年前

    public class ShortDivision {
        public static void main(String[] args) {
            short i = 2;
            short j = 1;
            short k = i/j;
        }
    }
    

    ShortDivision.java:5: possible loss of precision
    found   : int
    required: short
            short k = i/j;
    

    因为表达式i/j的类型显然是int,因此必须转换为short。

    为什么是这种类型 i/j

    3 回复  |  直到 16 年前
        1
  •  20
  •   Community Mohan Dere    9 年前

    Java spec :

    5.6.2二进制数字升级

    如果其中一个操作数的类型为double,则另一个操作数将转换为double。

    否则,如果其中一个操作数的类型为float,则另一个操作数将转换为float。

    否则,两个操作数都将转换为int类型。

    对于二进制操作,小整数类型升级为 int 手术的结果是 .


    编辑:

    另见: OR-ing bytes in C# gives int

        2
  •  2
  •   Mark Byers    16 年前

    关于动机:让我们想象一下这种行为的替代方案,看看它们为什么不起作用:

    添加int和short的结果应该是什么?

    备选方案2:结果应始终是能够表示所有可能输出的最小类型。

    如果返回类型是short,那么答案并不总是可以表示为short。

    short result = -32768 / -1; // 32768: not a short
    

    因此,您的问题变成:为什么添加两个int不会返回一个long?两个整数的乘法应该是什么?很久了?覆盖最小整数值平方的大数字?

    备选方案3:选择大多数人可能大部分时间都想要的东西

    因此,结果应该是:

    • int用于乘以两个短路或任何int操作。
    • 如果将字节向右移位,则为字节;如果将字节向左移位,则为int。

        3
  •  0
  •   Peter Lawrey    16 年前

    例如,可以实现i*j,以便从byte=>提升类型;短,短=>int和int=>很长,这样可以避免溢出,但事实并非如此(在某些语言中确实如此)如果需要当前的行为,可以使用强制转换,但某些位的丢失是显而易见的。

    类似地,可以从byte/short=>提示i/j;浮点或整数/长=>双重的