当整数算术运算溢出时,Rust 编程语言会发生什么?

Har*_*n U 9 integer-overflow rust

据我所知,在 C 编程语言(以及许多基于 C 的语言)中,当算术运算溢出 N 位整数时,此溢出会将结果缩短为 2 的模 N 次方,仅保留 LSB结果。

当这样的整数算术运算在 Rust 编程语言中溢出时会发生什么。

kop*_*ecs 12

当您在调试模式下编译 xe2x80x99 时,Rust 会检查整数溢出,如果发生这种行为,则会导致程序在运行时出现恐慌。

\n

当您使用该标志在发布模式下进行编译时--release,Rust 不包括对导致恐慌的整数溢出的检查。对于有符号值,结果基于二进制补码换行。对于无符号值,结果以类型的最大值 + 1 为模。

\n

标准库有许多函数可以更好地控制溢出情况下应该发生的情况,例如,checked_addwrapping_add和一些其他变体。

\n

如果您还没有阅读过,我建议您阅读《The Rust 编程语言》,其中有一专门讨论了这个问题。

\n


sk_*_*ant 6

来自Rust 参考,“行为不被认为是不安全的”一章

整数溢出

如果程序包含算术溢出,则程序员就犯了错误。在下面的讨论中,我们保持算术溢出和包装算术之间的区别。第一个是错误的,第二个是故意的。

当程序员启用debug_assert!断言(例如,通过启用非优化构建)时,实现必须插入panic溢出时的动态检查。其他类型的构建可能会导致panics溢出或静默包装值,具体由实现自行决定。

在隐式包装溢出的情况下,实现必须通过使用二进制补码溢出约定来提供明确定义的(即使仍然被认为是错误的)结果。

整型提供了固有的方法来允许程序员显式地执行包装算术。例如,i32::wrapping_add提供二进制补码、换行加法。

标准库还提供了一种Wrapping<T>新类型,确保所有标准算术运算都T具有包装语义。

有关错误条件、基本原理以及有关整数溢出的更多详细信息,请参阅RFC 560 。

因此,根据您的编译器设置,您的程序在溢出时可能会出现恐慌或静默换行。依赖这些行为中的任何一个都不是一个好主意。如果您需要处理溢出的可能性,请使用包装函数明确告诉编译器您希望并期望溢出包装回来,或者使用检查方法(例如u32::checked_add手动处理溢出)。