执行一个数学运算后,例如,乘以两个整数,是否可以使用C++访问CPU中的溢出标志寄存器?如果没有其他快速的方法来检查溢出?是否可以使用C++访问CPU中的溢出标志寄存器?
6
A
回答
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
这可能不是你想要的,原因有两个做什么:
- 不是每一个CPU具有用C溢出标志
- ++实际上是没有办法访问溢出标志
以前发布的溢出检查提示可能会有用。
如果你真的想编写快速的代码,使两个整数相乘并检查溢出标志,你将不得不使用程序集。如果你想为x86的一些例子,然后就问
相关问题
- 1. 是否可以访问C中的32位寄存器?
- 2. 是否有可能访问CPU寄存器,如LR,PC
- 3. 是否可以从SRTM访问TPM的本地2寄存器?
- 4. C++ CPU寄存器的使用
- 5. 如何访问c中的CPU寄存器?
- 6. 溢出状态寄存器标志时移位
- 7. EFLAGS寄存器中的进位标志和溢出标志的用途是什么?
- 8. 在CPU寄存器中分配寄存器变量的标准?
- 9. 如何理解和更改bochsdbg中的CPU寄存器标志?
- 10. 溢出一个寄存器
- 11. 寄存器溢出是否可能导致CUDA_EXCEPTION_5,超出范围地址错误?
- 12. 轻松访问Windows中的Intel CPU I/O寄存器
- 13. 访问多核CPU中/ cross核心之间的寄存器
- 14. 是否可以通过内联汇编访问硬件寄存器
- 15. 装配,检测溢出的寄存器
- 16. x86如何硬件检测和设置溢出寄存器标志
- 17. ARM Neon Assembler - 处理溢出寄存器
- 18. 编译器是否管理CPU寄存器?
- 19. 在C++中使用寄存器变量可以做多少坏
- 20. 从CPU转储CPU寄存器
- 21. 是否可以使用mylyn访问@task?
- 22. 是否可以访问WebView缓存?
- 23. 我可以使用我的CPU寄存器来提高速度性能吗?
- 24. EBX寄存器用于内存访问的模式是什么?
- 25. 是否可以在JavaScript中使用浏览器访问音频?
- 26. 可以将普通数组放入cpu寄存器吗?
- 27. 如何每个线程都可以有CPU寄存器
- 28. 可以寄存器在CPU内部做算术
- 29. 是否可以在iOS中访问扬声器输出?
- 30. Z80状态标志寄存器
入住这http://stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-cc – acrilige
@acrilige谢谢,,那回答我的问题的第二部分,关于如何在执行计算后检查溢出的任何想法? –
由于显而易见的原因,不可能以标准的便携方式直接访问溢出标志寄存器。但是,您可以确定一个操作是否会在一点点工作的情况下溢出,并且可以通过非标准的非便携方式来检查这个溢出或检测溢出。 –