Scala,Long,Int等中的类型

Dre*_*w H 30 scala

请输入.

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)

  • 这反过来又从FORTRAN那里得到了它们,它们来自ASM.伤心.当我父亲出生时,我们处于一种不存在的职业中,我们就像塔尔穆德学者对古代文本的研究. (4认同)
  • 责备C. Scala和C#都从Java复制了固定大小的整数规则,Java基本上从C++复制了它的规则,而C++又从C克隆了它们. (3认同)