是否可以使用C++访问CPU中的溢出标志寄存器?

Loe*_*rio 11 c++ assembly flags integer-overflow

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

Ale*_*nze 9

不,一般来说这是不可能的.有些CPU甚至没有这样的标志(例如MIPS).

其中一条评论中提供的链接将为您提供有关如何进行溢出检查的建议.

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


SCh*_*rin 7

我建议在每个适当的情况下阅读.来自 C++中的优化软件 -

整数溢出是另一个安全问题.官方的C标准说在溢出的情况下有符号整数的行为是"未定义的".这允许编译器忽略溢出或假设它不会发生.在Gnu编译器的情况下,假设没有发生有符号整数溢出会产生令人遗憾的结果,它允许编译器优化掉溢出检查.针对这个问题有许多可能的补救措施:(1)在发生溢出之前检查溢出,(2)使用无符号整数 - 它们保证环绕,(3)使用选项捕获整数溢出-ftrapv,但这是非常低效的,(4)使用选项获取此类优化的编译器警告 -Wstrict-overflow=2,或(5)使用选项-fwrapv或使用明确定义的溢出行为 -fno-strict-overflow.