Scala,Long,Int等中的类型
发布时间:2020-12-16 09:36:35 所属栏目:安全 来源:网络整理
导读:请输入。 scala 86400000 * 150res0: Int = 75098112scala val i : Long = 86400000 * 150i: Long = 75098112 val i = 86400000 * 150.asInstanceOf[Long]i: Long = 12960000000val i = 86400000 * 150Li: Long = 12960000000 世界在这里发生了什么?我一直
请输入。
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 世界在这里发生了什么?我一直在跳伞,我必须说这是我见过的最危险的事情。没有编译器检查这个?显然,如果我用一个变量代替了150。 *编辑* 这是让我担心的实际代码。 val oneDay = 86400000 val days150 = oneDay * 150 days150 = 75098112 这不是斯卡拉的错,也不是我自己的错。让我很担心 解决方法
没有什么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 } } 这里的未经检查的部分是因为C#编译器足够聪明才能实现操作溢出,而只是因为两个操作数都是常量。如果任一操作数是一个变量,那么没有未经检查就可以了。 同样在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 } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |