乘以两个字节

Mat*_*usz 4 java byte

有人可以解释我为什么不能以这种方式乘以两个字节?

byte a = 1;
byte b = 1;
byte c = a*b;
Run Code Online (Sandbox Code Playgroud)

要么

byte a = 1;
byte b = 1;
short c = a*b;
Run Code Online (Sandbox Code Playgroud)

为什么我必须这样做呢?

byte a = 1;
byte b = 1;
byte c = (byte)(a*b);
Run Code Online (Sandbox Code Playgroud)

要么

byte a = 1;
byte b = 1;
int/double/float/long c = a*b;
Run Code Online (Sandbox Code Playgroud)

rge*_*man 10

使用bytes 执行数学运算时,将按照JLS第5.6.2节的规定进行二进制数字提升.

当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则适用,顺序如下:

  1. 如果任何操作数是引用类型,则进行拆箱转换(第5.1.8节).

  2. 应用扩展基元转换(第5.1.2节)来转换由以下规则指定的一个或两个操作数:

    • 如果任一操作数的类型为double,则另一个操作数转换为double.

    • 否则,如果任一操作数的类型为float,则另一个操作数转换为float.

    • 否则,如果任一操作数的类型为long,则另一个操作数转换为long.

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

(强调我的)

这会强制您分配至少与转换为int或转换为的类型byte.


ama*_*ouz 0

两个字节的乘积不一定适合一个字节。因此,Java 需要您告诉它您知道自己在做什么,并确认在溢出的情况下您将获得低位。

  • 原因不是这个。根据这个推理,乘以 2 个“int”将迫使您分配给“long”或强制转换为“int”。 (4认同)