加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读