Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以使用C+访问CPU中的溢出标志寄存器+;? 在执行数学运算后,例如,乘以两个整数,是否可以用C++访问CPU中的溢出标志登记?如果没有,还有什么快速方法可以检查溢出?_C++_Assembly_Flags_Integer Overflow - Fatal编程技术网

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

是否可以使用C+访问CPU中的溢出标志寄存器+;? 在执行数学运算后,例如,乘以两个整数,是否可以用C++访问CPU中的溢出标志登记?如果没有,还有什么快速方法可以检查溢出?,c++,assembly,flags,integer-overflow,C++,Assembly,Flags,Integer Overflow,没有,通常是不可能的。有些CPU甚至没有这样的标志(例如MIPS) 其中一条评论中提供的内容将为您提供如何进行溢出检查的想法 请记住,在C和C++中,有符号整数溢出会导致未定义的行为,并且在法律上不能在事实之后执行溢出检查。您要么需要使用无符号算术,要么在算术运算之前进行检查。我建议在每种适当的情况下都阅读此阅读。从- 整数溢出是另一个安全问题。官方的C标准 表示有符号整数在溢出情况下的行为是 “未定义”。这允许编译器忽略溢出或假定 它不会发生。对于Gnu编译器,假设 有符号整数溢出没有发生,这

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

其中一条评论中提供的内容将为您提供如何进行溢出检查的想法


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

我建议在每种适当的情况下都阅读此阅读。从-

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


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

  • 并非每个CPU都有溢出标志
  • 使用C++,实际上没有办法访问溢出标志 人们以前发布的溢出检查提示可能很有用


    如果您真的想编写两个整数相乘并检查溢出标志的快速代码,则必须使用汇编。如果您想了解x86的一些示例,那么一定要询问,您必须执行该操作并检查内联汇编中的溢出位。您可以这样做,并在溢出时跳转到标签,或者(更一般但效率较低)在溢出时设置变量。

    否。最好的方法是根据需要提前检查

    如果没有,还有什么快速方法可以检查溢出

    如果需要在操作后进行测试,可以使用浮点表示法(双精度)-每个32位整数都可以精确地表示为浮点数。 如果你所支持的所有机器都支持IEEE(如果你不需要考虑大型机的话),你可以做这些操作,然后在结果上使用ISFIN或ISIF。 Fast(就程序员的努力而言)的方法是:IEEE浮点运算标准(IEEE 754)定义了五个异常,每个异常都返回一个默认值,并有一个相应的状态标志,当异常发生时(在某些下溢情况下除外)会引发该状态标志。 五种可能的例外情况是:

    • 无效操作:数学上未定义,例如负数的平方根。默认情况下,返回qNaN
    • 零除:对有限操作数的运算给出精确的无限结果,例如1/0或log(0)。默认情况下,返回±无穷大
    • 溢出:结果太大,无法正确表示(即,其指数范围无限的指数将大于emax)。默认情况下,将舍入模式返回±无穷大(并遵循定向舍入模式的舍入规则)。
    • 下溢:结果非常小(超出正常范围)且不精确。默认情况下,返回低于正常值或零(遵循舍入规则)
    • 不精确:精确的(即未经取整的)结果无法精确表示。默认情况下,返回正确舍入的结果

    检查此@acrilige谢谢,这回答了我问题的第二部分,您知道如何在执行计算后检查溢出吗?由于明显的原因,无法以标准的便携方式直接访问溢出标志寄存器。但是,您可以通过少量的工作来确定操作是否会溢出,并且可以通过非标准的非便携方式来检查或检测溢出。为什么不能在计算之前检查溢出?将结果除以被乘数。如果你没有得到乘数,那么它就溢出了。请注意,这个问题是有标记的,是关于有符号整数溢出的。不是FP溢出到+-Inf。您可以通过
    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位
    双精度
    可以表示其他数字