为什么模运算a % b
的结果类型与a
的类型相同,而不是b
的类型?
除法后从不的余数将高于除数,因此结果的类型将适合除数的类型。因此,在a % b
中,结果将适合b
的类型。
因此,如果b
是Int
,则结果也应该是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论坛中要求同样的人进行对话。
答案 0 :(得分:3)
正如评论中提到的,Scala在这里遵循Java。 Java遵循C。实际上C有充分的理由!即:
它具有独立的带符号和无符号类型;
a % b
的结果与a
具有相同的符号(例如-10 % 3
是-1
)。 (这在较早的C版本中不是必需的,但始终允许。)
因此,如果上面的-10
是signed long
,而3
是unsigned int
,那么结果就不能与除数相同,因为必须对其进行签名。也不能是signed int
,因为我们可以用3
而不是unsigned int
来代替signed int
。应用与其他算术运算符相同的规则可以得出合理的返回类型,因此C就是这样做的。
答案 1 :(得分:1)