2013-01-16 38 views
6

执行一个数学运算后,例如,乘以两个整数,是否可以使用C++访问CPU中的溢出标志寄存器?如果没有其他快速的方法来检查溢出?是否可以使用C++访问CPU中的溢出标志寄存器?

+2

入住这http://stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-cc – acrilige

+0

@acrilige谢谢,,那回答我的问题的第二部分,关于如何在执行计算后检查溢出的任何想法? –

+0

由于显而易见的原因,不可能以标准的便携方式直接访问溢出标志寄存器。但是,您可以确定一个操作是否会在一点点工作的情况下溢出,并且可以通过非标准的非便携方式来检查这个溢出或检测溢出。 –

回答

6

不,通常是不可能的。一些CPU甚至没有这样的标志(例如MIPS)。

在其中一个注释中提供的link将为您提供关于如何执行溢出检查的想法。

请记住,在C和C++中,有符号整数溢出会导致未定义的行为,并且在法律上您无法在事实之后执行溢出检查。您需要使用无符号算术或在算术运算之前进行检查。

4

我建议在每一个适当的情况下阅读。从Optimizing software in C++ -

整数溢出是另一个安全问题。官方C标准 表示在溢出情况下,有符号整数的行为是 “未定义”。这允许编译器忽略溢出或假定其不发生。在Gnu编译器的情况下,假设 有符号整数溢出不会发生,具有不幸的 的后果,即它允许编译器优化溢出 检查。对此问题有几种可能的补救措施:(1)在发生溢出之前检查溢出;(2)使用无符号整数; - 它们保证环绕;(3)陷阱整数溢出, 选项-ftrapv,但(4)通过选项 -Wstrict-overflow=2得到编译器 这样的优化警告,或者(5)通过选项 -fwrapv-fno-strict-overflow使溢出行为良好定义。

0

这可能不是你想要的,原因有两个做什么:

  1. 不是每一个CPU具有用C溢出标志
  2. ++实际上是没有办法访问溢出标志

以前发布的溢出检查提示可能会有用。

如果你真的想编写快速的代码,使两个整数相乘并检查溢出标志,你将不得不使用程序集。如果你想为x86的一些例子,然后就问

相关问题