是否可以使用C+访问CPU中的溢出标志寄存器+;? 在执行数学运算后,例如,乘以两个整数,是否可以用C++访问CPU中的溢出标志登记?如果没有,还有什么快速方法可以检查溢出?
没有,通常是不可能的。有些CPU甚至没有这样的标志(例如MIPS) 其中一条评论中提供的内容将为您提供如何进行溢出检查的想法是否可以使用C+访问CPU中的溢出标志寄存器+;? 在执行数学运算后,例如,乘以两个整数,是否可以用C++访问CPU中的溢出标志登记?如果没有,还有什么快速方法可以检查溢出?,c++,assembly,flags,integer-overflow,C++,Assembly,Flags,Integer Overflow,没有,通常是不可能的。有些CPU甚至没有这样的标志(例如MIPS) 其中一条评论中提供的内容将为您提供如何进行溢出检查的想法 请记住,在C和C++中,有符号整数溢出会导致未定义的行为,并且在法律上不能在事实之后执行溢出检查。您要么需要使用无符号算术,要么在算术运算之前进行检查。我建议在每种适当的情况下都阅读此阅读。从- 整数溢出是另一个安全问题。官方的C标准 表示有符号整数在溢出情况下的行为是 “未定义”。这允许编译器忽略溢出或假定 它不会发生。对于Gnu编译器,假设 有符号整数溢出没有发生,这
<>请记住,在C和C++中,有符号整数溢出会导致未定义的行为,并且在法律上不能在事实之后执行溢出检查。您要么需要使用无符号算术,要么在算术运算之前进行检查。我建议在每种适当的情况下都阅读此阅读。从- 整数溢出是另一个安全问题。官方的C标准 表示有符号整数在溢出情况下的行为是 “未定义”。这允许编译器忽略溢出或假定 它不会发生。对于Gnu编译器,假设 有符号整数溢出没有发生,这是不幸的 结果是它允许编译器优化溢出 检查。针对这一问题,有许多可能的补救措施: (1) 在溢出发生之前检查它,(2)使用无符号整数- 它们保证环绕,(3)使用 选项
-ftrapv
,但这是非常低效的,(4)获取编译器
使用选项进行此类优化的警告
-Wstrict overflow=2
,或(5)使用选项定义溢出行为
-fwrapv
或-fno严格溢出
这可能不是您想要做的,原因有两个:
如果您真的想编写两个整数相乘并检查溢出标志的快速代码,则必须使用汇编。如果您想了解x86的一些示例,那么一定要询问,您必须执行该操作并检查内联汇编中的溢出位。您可以这样做,并在溢出时跳转到标签,或者(更一般但效率较低)在溢出时设置变量。否。最好的方法是根据需要提前检查 如果没有,还有什么快速方法可以检查溢出 如果需要在操作后进行测试,可以使用浮点表示法(双精度)-每个32位整数都可以精确地表示为浮点数。 如果你所支持的所有机器都支持IEEE(如果你不需要考虑大型机的话),你可以做这些操作,然后在结果上使用ISFIN或ISIF。 Fast(就程序员的努力而言)的方法是:IEEE浮点运算标准(IEEE 754)定义了五个异常,每个异常都返回一个默认值,并有一个相应的状态标志,当异常发生时(在某些下溢情况下除外)会引发该状态标志。 五种可能的例外情况是:
- 无效操作:数学上未定义,例如负数的平方根。默认情况下,返回qNaN
- 零除:对有限操作数的运算给出精确的无限结果,例如1/0或log(0)。默认情况下,返回±无穷大
- 溢出:结果太大,无法正确表示(即,其指数范围无限的指数将大于emax)。默认情况下,将舍入模式返回±无穷大(并遵循定向舍入模式的舍入规则)。
- 下溢:结果非常小(超出正常范围)且不精确。默认情况下,返回低于正常值或零(遵循舍入规则)
- 不精确:精确的(即未经取整的)结果无法精确表示。默认情况下,返回正确舍入的结果
fenv
:::访问FP标志fetestexcept(FE_溢出)
检查FP溢出标志。(只有在使用上的#pragma STDC FENV_访问或某些编译器的命令行选项时才正确。有一个例子。)我明白了-每个整数都可以表示为浮点数,没有其他快速方法。除了提前检查。double
可以表示每个int32\u t
,但不是每个int64\u t
。因此,可以在转换回int
之前检查double
的范围。这几乎没有效率,所以我想知道你的观点。有些机器将有一个80位或更宽的<>代码> long double /COD>,它可以代表每一个<代码>“It64”,<>代码>,但是许多C++实现只有64位FP。此外,FP溢出与此问题无关(除非您执行实际产生FP溢出的多次乘法)。双精度浮点数受10^308的限制。超过10^64。IEEE 754是关于单精度和双精度的。是的,这是最高的有限double
,但是第一个不可表示的整数值double
是2^53+1,因为它有53位尾数。64位双精度
可以表示其他数字