为什么不';tc和C++;是否有内置的方法来检查整数溢出? 为什么C和C++不提供一组实现的操作来执行每个基本的整数操作,并提供溢出检查(例如 BoOL SufAdAd(int *Outin,int a,int b)< />代码>

为什么不';tc和C++;是否有内置的方法来检查整数溢出? 为什么C和C++不提供一组实现的操作来执行每个基本的整数操作,并提供溢出检查(例如 BoOL SufAdAd(int *Outin,int a,int b)< />代码>,c++,c,integer-overflow,C++,C,Integer Overflow,据我所知,大多数指令集都有办法判断操作是否溢出(例如x86溢出和进位标志),并定义在有符号整数的情况下是否会发生 这样,编译器是否应该做得更好,创造更简单和更快的操作,而不是在C和C++中可能的代码?可能是因为没有需求。算术溢出是错误的 未定义的行为,明确表示允许实现这样做 检查。如果编译器供应商认为这样做会卖得更多 编译器,他们会 实际上,编译器很难做到这一点 比程序员更有效。这是相当标准的 验证所有数值输入范围的过程,其中 您可以证明以后的操作不会溢出。一切都好 程序员这样做是一种习惯。所以

据我所知,大多数指令集都有办法判断操作是否溢出(例如x86溢出和进位标志),并定义在有符号整数的情况下是否会发生


这样,编译器是否应该做得更好,创造更简单和更快的操作,而不是在C和C++中可能的代码?

可能是因为没有需求。算术溢出是错误的 未定义的行为,明确表示允许实现这样做 检查。如果编译器供应商认为这样做会卖得更多 编译器,他们会

实际上,编译器很难做到这一点 比程序员更有效。这是相当标准的 验证所有数值输入范围的过程,其中 您可以证明以后的操作不会溢出。一切都好 程序员这样做是一种习惯。所以这意味着一个快速的
if
输入后立即执行,无需进一步检查

尽管如此,程序员还是会犯错误,这很容易理解 以后更改计算时,请忘记更正验证。 我希望在编译器中看到这样的特性。但显然不会 帮助销售编译器,或者至少供应商认为不会,所以
我们不明白。为什么?因为C++从那时开始就不在C了,因为此后没有人提出这样的函数,并且成功地说服编译器制造商和委员会成员,他们是足够有用的。 请注意,编译器包含这类内部函数,因此并不反对它们

还要注意的是,有一些建议可以标准化像和这样的东西


因此,可能只是兴趣不够。

< P> C和C++遵循一个中心原则:“你不为你不需要的东西付出代价”。因此,默认的算术运算不会偏离底层体系结构的单一算术运算指令

至于为什么没有一个标准的库函数来添加两个整数和检测溢出,我不能说。首先,语言似乎将有符号整数溢出定义为:

在C编程语言中,有符号整数溢出会导致未定义的行为

考虑到有多种方法可以实现有符号整数(一的补码、二的补码等),并且在创建C时,这些体系结构都很流行,这是不可理解的原因。如果没有关于底层平台的大量信息,很难实现“安全*”的纯C函数。它可以在一个CPU一个CPU的基础上完成

但这并不意味着这是不可能的。如果有人能向C或C++标准体找到安全溢出帮助者的建议,并且能够了解他们被拒绝的原因,我肯定会感兴趣。
不管怎样,在实践中有很多方法可以检测算术溢出和库来提供帮助。

这个问题会定期出现

首先,记住C被定义为可移植的和高效的。因此,它被设计为只提供由许多硬件支持的操作(可能在x86出现之前)

其次,许多编译器为此类操作提供()内置,因此用户可以使用在后台使用这些内置的类类型。内置实现的质量并不重要(尽管如此),重要的是编译器意识到了它们的意义,可以在可以证明它们无用时优化签出


最后,还有其他方法可以实际检查程序。例如,静态分析或&单元测试可以尽早检测到这些缺陷,并避免(或多或少完全)在发布版本中嵌入这些溢出检查。

一个更好的问题可能是:为什么整数溢出行为未定义?实际上,99.9%的CPU使用2的补码和进位/溢出位。因此在现实世界中,在汇编程序/操作码级别上,整数溢出总是定义良好的。事实上,许多汇编程序或与硬件相关的C语言严重依赖于定义良好的整数溢出(特别是计时器硬件的驱动程序)

<>原始的C语言,在标准化之前,可能没有详细地考虑过这样的事情。但是当C被ANSI和ISO标准化后,他们必须遵循一定的标准化规则。ISO标准不允许偏向于某一技术,从而使某一公司在竞争中获得优势

因此,他们必须考虑到一些CPU可能实现模糊的事物,如一个补语,“符号和幅度”或“一些实现定义的方式”。他们必须允许有符号零、填充位和其他模糊的有符号整数机制

正因为如此,有符号数字的行为变得非常模糊。当C中的有符号整数溢出时,您无法判断会发生什么情况,因为有符号整数可能表示为二的补码、一的补码或其他实现定义的疯狂。因此,整数溢出是未定义的行为

解决这个问题的明智办法不是发明一些安全范围检查,而是声明C语言中的所有有符号整数都应该有2的补码格式,即故事结束。然后一个无符号字符将始终是0到127,溢出到-128,所有内容都将定义良好。但人为的标准官僚主义阻止了标准变得理智

在C标准中有许多类似的问题。对齐/填充、端部等。

因为