如何在 Crystal 中进行不安全的加法(不抛出 OverflowException 的加法)?
How to do an unsafe addition (addition without throwing OverflowException) in Crystal?
如何添加 Int::MAX + 1
而没有得到 OverflowException
?我知道我能做到
def add_unsafe(a : Int, b : Int) : Int
((a.to_i128 + b.to_i128) % Int32::MAX).to_i
end
但是有没有其他方法可以做到这一点?
您正在寻找包装运算符。大多数数学运算符都有一个以 &
为前缀的包装变体。所以在你的情况下,那将是 a &+ b
.
顺便说一句。您的示例不起作用,因为 to_i
仍然进行溢出检查。所以调用 add_unsafe(Int32::MAX, 1)
会引发错误。
更准确的包装行为表示是 (a.to_i128 + b.to_i128) % Int32::MAX
。不过,&+
运算符显然更好。
如何添加 Int::MAX + 1
而没有得到 OverflowException
?我知道我能做到
def add_unsafe(a : Int, b : Int) : Int
((a.to_i128 + b.to_i128) % Int32::MAX).to_i
end
但是有没有其他方法可以做到这一点?
您正在寻找包装运算符。大多数数学运算符都有一个以 &
为前缀的包装变体。所以在你的情况下,那将是 a &+ b
.
顺便说一句。您的示例不起作用,因为 to_i
仍然进行溢出检查。所以调用 add_unsafe(Int32::MAX, 1)
会引发错误。
更准确的包装行为表示是 (a.to_i128 + b.to_i128) % Int32::MAX
。不过,&+
运算符显然更好。