在两个大整数的乘法中需要一个演员吗?

时间:2017-03-08 12:41:26

标签: java

假设您有两个大整数,并且想要将它们相乘。

    SpannableString ss = new SpannableString("Your string value");
    ClickableSpan clickableTerms = new ClickableSpan() {
      @Override
      public void onClick(View textView) {
               // show toast here
         }
      @Override
      public void updateDrawState(TextPaint ds) {
           super.updateDrawState(ds);
           ds.setUnderlineText(true);

                }
            };
  ss.setSpan(clickableTerms, 4, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  myTextView.setText(ss);
  myTextView.setMovementMethod(LinkMovementMethod.getInstance());
  myTextView.setHighlightColor(Color.TRANSPARENT);

为什么要进行强制转换,即使赋值是一个可以容纳结果的变量?

6 个答案:

答案 0 :(得分:3)

是的,需要演员。

如果未将int个参数中的一个或两个转换为long,则乘法将作为32位运算执行。如果乘法溢出,则最终分配给result的值将不正确。

正如JLS所述(15.7.1):

  

如果整数乘法溢出,则结果是数学乘积的低阶位,如某些足够大的二进制补码格式所示。结果,如果发生溢出,则结果的符号可能与两个操作数值的数学乘积的符号不同。

如果将一个或两个操作数强制转换为long,则乘法将作为64位操作执行,并且操作不会溢出。

(还有其他方法可以使用long算术执行操作,但是类型转换是最惯用的。)

答案 1 :(得分:1)

在您的情况下,您首先将a投射到long然后进行乘法运算。

您可以更新操作以确保这将导致像long result = 1L * a * b那样长,操作的数字结果将很长,因为它在开头使用了一个long(注意操作符的优先级)课程)。

但这不会起作用

long result = a * b * 1L

因为整数乘法将首先完成并存储在整数中。

有关优先级的解释,请参阅我的回答here

答案 2 :(得分:0)

这是因为你的案例中的a和b是整数,你需要先将它们转换为long(cast),否则你就是冲突的。因为long可以容纳你的结果,因为它有更多的位(即64位),然后是简单的int数据类型。

答案 3 :(得分:0)

进行任何算术运算时,必须知道运算符的优先级。赋值运算符具有最小优先级,因此首先计算结果然后将其分配给给定变量,因此计算JAVA时会分配具有最高字节存储的变量类型的内存字节。例如

  • int * int计算结果将存储在int
  • int * float计算结果将存储在float
  • float * double计算结果将存储在double
  • int * float * double计算结果将存储在double

因此,在您的示例中,计算结果将存储在int中,然后仅进行赋值。

答案 4 :(得分:-1)

我认为这是因为序列。第一次乘法第二次分配。

干杯。

答案 5 :(得分:-2)

java中int类型的范围是-2,147,483,648到2,147,483,647,我们得到的结果是30000000000不能被int保持这么久所需。