为什么取模运算结果采用除数类型而不是除数类型?

时间:2019-12-08 19:14:55

标签: java scala math

为什么模运算a % b的结果类型与a的类型相同,而不是b的类型?

除法后从不的余数将高于除数,因此结果的类型将适合除数的类型。因此,在a % b中,结果将适合b的类型。

因此,如果bInt,则结果也应该是Int。为什么是Long

示例:

val a: Long = Long.MaxValue
val b: Int = 10

a % b

结果:

a: Long = 9223372036854775807
b: Int = 10

res0: Long = 7

res0中,我期望有一个Int

我在Scala contributors论坛中要求同样的人进行对话。

2 个答案:

答案 0 :(得分:3)

正如评论中提到的,Scala在这里遵循Java。 Java遵循C。实际上C有充分的理由!即:

  1. 它具有独立的带符号和无符号类型;

  2. a % b
  3. 结果与a具有相同的符号(例如-10 % 3-1)。 (这在较早的C版本中不是必需的,但始终允许。)

因此,如果上面的-10signed long,而3unsigned int,那么结果就不能与除数相同,因为必须对其进行签名。也不能是signed int,因为我们可以用3而不是unsigned int来代替signed int。应用与其他算术运算符相同的规则可以得出合理的返回类型,因此C就是这样做的。

答案 1 :(得分:1)

因为它解析为以下w3schools的重载版本

def %(x: Int): Long

我们看到的返回类型是Long