请输入.
scala> 86400000 * 150
res0: Int = 75098112
scala> val i : Long = 86400000 * 150
i: Long = 75098112
val i = 86400000 * 150.asInstanceOf[Long]
i: Long = 12960000000
val i = 86400000 * 150L
i: Long = 12960000000
Run Code Online (Sandbox Code Playgroud)
世界上到底发生了什么?我一直在跳伞,我必须说这是我见过的最危险的事情.没有编译器检查这个?显然,如果我用150代替一个不同的变量.
这是让我担心的实际代码.
val oneDay = 86400000
val days150 = oneDay * 150
days150 = 75098112
Run Code Online (Sandbox Code Playgroud)
除了我自己以外,这不是Scala的错,也不是任何故障.让我担心
Jon*_*eet 15
关于此,Scala没有特定的内容.这只是分配的目标类型与执行操作(在这种情况下是乘法)的类型无关的问题.
例如,在C#中:
using System;
class Program
{
static void Main(string[] args)
{
int a = unchecked(86400000 * 150);
long b = unchecked(86400000 * 150);
long c = 86400000 * (long) 150;
long d = 86400000 * 150L;
Console.WriteLine(a); // 75098112
Console.WriteLine(b); // 75098112
Console.WriteLine(c); // 12960000000
Console.WriteLine(d); // 12960000000
}
}
Run Code Online (Sandbox Code Playgroud)
unchecked这里的部分是因为C#编译器足够智能以实现操作溢出,但仅仅因为两个操作数都是常量.如果任一操作数都是变量,那么没有操作数就可以了unchecked.
同样在Java中:
public class Program
{
public static void main(String[] args)
{
int a = 86400000 * 150;
long b = 86400000 * 150;
long c = 86400000 * (long) 150;
long d = 86400000 * 150L;
System.out.println(a); // 75098112
System.out.println(b); // 75098112
System.out.println(c); // 12960000000
System.out.println(d); // 12960000000
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20393 次 |
| 最近记录: |