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

为什么字节和短除法导致Java中的int?

仲孙默
2023-03-14
问题内容

在Java中,如果将bytes,shorts或ints相除,则总会得到一个int。如果操作数之一是long,我们将得到long

我的问题是-为什么byteshort除法不会导致byteshort?为什么总是int

显然,我不是在寻找“因为JLS这样说”的答案,而是在询问Java语言中此设计决策的技术原理。

考虑以下代码示例:

    byte byteA = 127;
    byte byteB = -128;
    short shortA = 32767;
    short shortB = -32768;
    int intA = 2147483647;
    int intB = - -2147483648;
    long longA = 9223372036854775807L;
    long longB = -9223372036854775808L;


    int byteAByteB = byteA/byteB;
    int byteAShortB = byteA/shortB;
    int byteAIntB = byteA/intB;
    long byteALongB = byteA/longB;

    int shortAByteB = shortA/byteB;
    int shortAShortB = shortA/shortB;
    int shortAIntB = shortA/intB;
    long shortALongB = shortA/longB;

    int intAByteB = intA/byteB;
    int intAShortB = intA/shortB;
    int intAIntB = intA/intB;
    long intALongB = intA/longB;

    long longAByteB = longA/byteB;
    long longAShortB = longA/shortB;
    long longAIntB = longA/intB;
    long longALongB = longA/longB;

byteA除以byteB一个字节就不能了,可以吗?
那么为什么一定byteAByteB是一个int?为什么不能shortALongBshort
为什么intALongB必须如此long,结果总是合适的int,不是吗?

更新资料

正如@Eran所指出的,其中的(byte)-128/(byte)-1结果128不适合byte。但是为什么不short呢?

更新2

接下来,正如@Eran再次指出的那样,(int) -2147483648 / (int) -1它也不适合,int但结果仍然int不是long


问题答案:

主要原因是机器通常只为其本地整数类型(和浮点数)添加指令。这就是为什么对于许多语言来说,算术表达式中使用最少的类型是int(通常以某种方式与基本机器整数类型相对应的类型)。

例如,i386规范说:

ADD对两个操作数(DEST和SRC)执行整数加法运算。相加的结果分配给第一个操作数(DEST),并相应地设置标志。将立即字节添加到单词或双字操作数时,立即数将符号扩展为单词或双字操作数的大小。

这意味着在内部将任何字节值扩展为整数(或类似值)。毕竟这是合理的,因为处理器是32/64位,然后以这些大小执行任何算术运算。如果有可能以字节为单位进行算术运算,通常认为这没有用。

在JVM规范指出,(加法),你有:iaddladdfadddadd。这仅反映了底层机器通常会表现出这样的事实。任何其他选择都是可能的,可能是以性能下降为代价的。



 类似资料:
  • 问题内容: 我可以通过将L附加到值来创建文字。为什么我不能以类似的方式创建字面量的short或byte?为什么我需要在转换时使用int文字? 如果答案是“因为C中没有短文字”,那么为什么C中没有短文字? 这实际上并没有以任何有意义的方式影响我的生活;写(短)0而不是0S很简单。但是这种矛盾使我感到好奇。这是当您深夜起床时困扰您的事情之一。有人在某个时候做出了设计决定,使得可以为某些原始类型输入文字

  • 在最新版本的JavaSpecialists时事通讯中,作者提到了一段在Java中不可编译的代码 尝试编译它,你会得到一个错误,比如: 为什么一段等价的C#代码没有显示出这样的问题?

  • 问题内容: 我收到编译器错误: 如果我不是完全错误,则二进制AND的结果与最长的操作数一样长。为什么结果是整数? 如果我想做空,会不会有表现上的损失? 问题答案: 如果我不是完全错误,则二进制AND的结果与最长的操作数一样长。为什么结果是整数? 因为Java语言规范说非长整数算法的结果始终是int。它可能写在的事实,32位CPU一样,内部的工作无论如何确认的方式-他们实际上不 具有 一种方法做算术

  • 问题内容: 考虑以下代码: 编译产生错误 因为表达式i / j的类型显然是int,因此必须将其强制转换为short。 为什么类型不短? 问题答案: 从Java规范: 5.6.2二进制数值提升 当运算符将二进制数值提升应用于一对操作数时,每个操作数必须表示一个数值类型的值,以下规则按顺序适用,并根据需要使用加宽转换(第5.1.2节)来转换操作数: 如果一个操作数的类型为double,则另一个将转换为

  • 我有一个我将像这样填充它 在这种情况下,如果返回类似的内容,那么最终结果是一个空的?这是为什么?我以为会捕获所有转义字符。

  • 使用sizeof()打印变量的大小 为什么sizeof()返回int的大小,而不是短int,即2个字节?