gpt4 book ai didi

scala - Scala,Long,Int等类型。

转载 作者:行者123 更新时间:2023-12-03 09:12:27 26 4
gpt4 key购买 nike

请输入。

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的错,也不是我的错。只是让我担心。

最佳答案

没有关于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
}
}

这里的 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
}
}

关于scala - Scala,Long,Int等类型。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8579659/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com