在溢出标志的情况下,访问此标志似乎对跨体系结构编程大有裨益。它将提供一种安全的替代方法来依赖未定义的行为来检查有符号整数溢出,例如:
if(a < a + 100) //detect overflow
我知道有一些安全的替代方案,例如:
if(a > (INT_MAX - 100)) //detected overflow
但是,C 和 C++ 语言似乎都缺少对状态寄存器或其中的各个标志的访问。为什么没有包含此功能,或者做出了哪些语言设计决定禁止包含此功能?
最佳答案
因为 C 和 C++ 被设计为与平台无关。状态寄存器不是。
如今,二进制补码普遍用于实现有符号整数运算,但情况并非总是如此。一个人的补码或符号和绝对值曾经很常见。当 C 刚被设计出来时,这样的 CPU 仍然很普遍。例如。 COBOL 区分那些体系结构中存在的负 0 和正 0。显然这些架构上的溢出行为是完全不同的!
顺便说一下,你不能依赖未定义的行为来检测溢出,因为reasonable compilers一见
if(a < a + 100)
会写警告并编译
if(true)
...(假设优化已打开且特定优化未关闭)。
请注意,您不能依赖警告。编译器只会在等价转换后条件为true
或false
时发出警告,但很多情况下条件会在溢出时修改而不会结束为普通的 true
/false
。
关于c++ - 为什么在 C 和 C++ 的设计中没有对 CPU 状态寄存器的内在访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12674969/