Har*_*n U 9 integer-overflow rust
据我所知,在 C 编程语言(以及许多基于 C 的语言)中,当算术运算溢出 N 位整数时,此溢出会将结果缩短为 2 的模 N 次方,仅保留 LSB结果。
当这样的整数算术运算在 Rust 编程语言中溢出时会发生什么。
kop*_*ecs 12
当您在调试模式下编译 xe2x80x99 时,Rust 会检查整数溢出,如果发生这种行为,则会导致程序在运行时出现恐慌。
\n当您使用该标志在发布模式下进行编译时--release
,Rust 不包括对导致恐慌的整数溢出的检查。对于有符号值,结果基于二进制补码换行。对于无符号值,结果以类型的最大值 + 1 为模。
标准库有许多函数可以更好地控制溢出情况下应该发生的情况,例如,checked_add
,wrapping_add
和一些其他变体。
如果您还没有阅读过,我建议您阅读《The Rust 编程语言》,其中有一节专门讨论了这个问题。
\n整数溢出
如果程序包含算术溢出,则程序员就犯了错误。在下面的讨论中,我们保持算术溢出和包装算术之间的区别。第一个是错误的,第二个是故意的。
当程序员启用
debug_assert!
断言(例如,通过启用非优化构建)时,实现必须插入panic
溢出时的动态检查。其他类型的构建可能会导致panics
溢出或静默包装值,具体由实现自行决定。在隐式包装溢出的情况下,实现必须通过使用二进制补码溢出约定来提供明确定义的(即使仍然被认为是错误的)结果。
整型提供了固有的方法来允许程序员显式地执行包装算术。例如,
i32::wrapping_add
提供二进制补码、换行加法。标准库还提供了一种
Wrapping<T>
新类型,确保所有标准算术运算都T
具有包装语义。有关错误条件、基本原理以及有关整数溢出的更多详细信息,请参阅RFC 560 。
因此,根据您的编译器设置,您的程序在溢出时可能会出现恐慌或静默换行。依赖这些行为中的任何一个都不是一个好主意。如果您需要处理溢出的可能性,请使用包装函数明确告诉编译器您希望并期望溢出包装回来,或者使用检查方法(例如u32::checked_add
手动处理溢出)。
归档时间: |
|
查看次数: |
1312 次 |
最近记录: |