当前位置: 首页 > 面试题库 >

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

从光启
2023-03-14
问题内容

考虑以下代码:

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不短?


问题答案:

从Java规范:

5.6.2二进制数值提升

当运算符将二进制数值提升应用于一对操作数时,每个操作数必须表示一个数值类型的值,以下规则按顺序适用,并根据需要使用加宽转换(第5.1.2节)来转换操作数:

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

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

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

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

对于二进制运算,会将小整数类型提升为int,运算结果为int

编辑:
为什么会这样?简短的答案是Java从C复制了此行为。更长的答案可能与以下事实有关:所有现代机器都至少执行32位本机计算,而实际上对于某些机器而言,执行8位运算和16位运算。



 类似资料:
  • 问题内容: 我为什么可以这样做: 但这不是: 它抛出: 从int到short可能的有损转换 我知道5是整数文字,您必须强制转换。我还了解,如果该值不是常数,则很明显需要抛出该错误,因为该值可能达到了short类型的限制。但是,为什么如果编译器知道我正在传递一个short可以容纳的常量(如在赋值中),则它不允许它进行编译?我的意思是,它们之间有什么区别? 问题答案: 为了理解为什么赋值类型转换在调用

  • 问题内容: 我在考虑使用C#或Java之类的语言时如何显示分页控件。 如果我有x个项目想要以每页y个块的形式显示,那么需要多少个页面? 问题答案: Ian提供的整数数学解决方案很好,但存在整数溢出错误。假设变量为all ,则解决方案可以重写为使用数学运算并避免错误: 如果为,则错误仍然存​​在。模数解决方案没有错误。

  • 在阅读参考资料时。com文档中的std::numeric_limits,我遇到了以下声明: 还提供了所有整数类类型的专门化。(从20世纪开始) 我的问题是,我们在上面的语句中所说的整数类类型是什么意思。我的意思是,我知道是C中的内置类型。我们可以在C中提供用户定义的类。但是我从来没有读过关于整数类类型的文章。我试着在谷歌上搜索这个短语,但是没有找到任何与此相关的东西。

  • 问题内容: 代码输出: 为什么值不同?为什么第二个输出看起来如此? 问题答案: 的浮点表示形式不正确: 那是因为浮点算法只是一种近似,尤其是当您超出了CPU可以准确建模的范围时(因为浮点是在硬件中处理的)。 整数除法不必将数字表示为浮点数,它只需要除以整数即可,在Python中整数可以任意增大而不会造成精度损失。 另请参阅: 浮点算法: Python教程中的 问题和局限性 每个程序员应了解的浮点运

  • 问题内容: 我知道整数在Java中是不可变的。但是为什么要这样设计呢? 我找不到强制Integer不可变的用例。是否有类似String的技术原因? 字符串在网络连接,数据库URL等中用作参数。如果它是可变的,则很容易遭到破坏。 支持StringPool功能。 支持使用字符串作为参数的类加载机制。字符串可变会导致加载错误的类。 我知道有些包装很易变。 更新: 从对话中,并没有普遍的理由要求整数是不可

  • 在代码中,只有第一种情况(整数变量到short)有编译错误(从int到short的有损转换)。为什么其他情况(整数字面改为short,最终整数变量改为short)没有这个相同的编译错误呢?