Swift 是唯一具有溢出检查算法的(主流)语言吗?

Is Swift the only (mainstream) language with overflow checking arithmetic?

我今天开始学习 Swift 语言。我学习了基础运算符和高级运算符。

对我来说,Swift 中的所有默认算术运算都要根据 overflow/underflow 检查这一事实有点令人惊讶。

还有其他主流语言有这个功能吗?

Swift 运行时的算法是否因此可能不是最佳的(性能方面)?

为什么他们在语言中包含这个功能,如果它很好,为什么其他人还没有使用它?

性能

这种验证必然会产生成本。在最低级别,导致溢出的操作需要单个 CPU 操作。在此操作期间检查是否存在溢出需要至少一个操作(例如使用 jump operations(分支)考虑溢出标志)。

请注意,根据实际代码,可能有很多优化可以在编译期间完成,以避免对每个操作进行耗时检查(简单示例:32 位 0 + 任何短不能溢出)。

所以,是的,包括支票不是最佳选择。

为什么

一些语言包括这种检查以减轻程序员的负担。如果程序员不用检查自己,他就不会犯不检查的错误。如果使用给定语言的程序员不能犯某些 class 错误,则该语言在可靠性方面的声誉会提高一点。

至于为什么其他一些语言不包含检查...不同的语言设计者有不同的哲学。对于某些人来说,重要的是允许程序员创建与理论上一样快的程序。对于其他一些人,更重要的是帮助程序员编写正确且健壮的程序。例如,C/C++ 以渲染超快程序而著称,而 Ada 以在您的程序很可能正确之前甚至不编译而著称。

有时是理念问题,有时是需求问题。在小型微控制器(小内存、慢时钟)上,您不希望有太多自动检查,因为它可能会显着减慢程序的执行速度。

其他语言

Here's a small table 关于语言处理(或不处理)整数溢出的不同方式。有些语言将它留给程序员。有些人提出例外。有些会更改数据类型以无错误地接受结果(例如:int 到 long,long 到 BigInteger)。