c++ - 为什么在 C 和 C++ 的设计中没有对 CPU 状态寄存器的内在访问?

标签 c++ c language-design

在溢出标志的情况下,访问此标志似乎对跨体系结构编程大有裨益。它将提供一种安全的替代方法来依赖未定义的行为来检查有符号整数溢出,例如:

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)

...(假设优化已打开且特定优化未关闭)。

请注意,您不能依赖警告。编译器只会在等价转换后条件为truefalse时发出警告,但很多情况下条件会在溢出时修改而不会结束为普通的 true/false

关于c++ - 为什么在 C 和 C++ 的设计中没有对 CPU 状态寄存器的内在访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12674969/

相关文章:

C++-#include "filename"

c++ - 在 C++ 中禁用自动 DLL 加载

C - 整数数组到带混合数字的整数

c - 从二维字符数组指针获取字符,该指针是 C 中结构指针的属性

programming-languages - 什么是通用类型?

java - JVM 实现的语言(如 Jython)是在底层使用 Java 还是使用 JVM native ?

macros - 数学 : Unevaluated vs Defer vs Hold vs HoldForm vs HoldAllComplete vs etc etc

c++ - __int64 与 int - 内存管理

c++ - 为什么编译器并不总是优化掉局部变量?

C电话本程序: Reposition cursor in text file to start of previous line