假设您有两个大整数,并且想要将它们相乘。
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);
为什么要进行强制转换,即使赋值是一个可以容纳结果的变量?
答案 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中,然后仅进行赋值。
答案 4 :(得分:-1)
我认为这是因为序列。第一次乘法第二次分配。
干杯。
答案 5 :(得分:-2)
java中int类型的范围是-2,147,483,648到2,147,483,647,我们得到的结果是30000000000不能被int保持这么久所需。