c++ - 为什么不在 C++ 中强制执行 2 的补码?

标签 c++ binary standards

新的 C++ 标准仍然拒绝指定整数类型的二进制表示。这是因为 C++ 的实际实现不使用 2 的补码算法吗?我觉得很难相信。是因为委员会担心 future 硬件的进步会使“比特”的概念过时吗?再次难以置信。任何人都可以对此有所了解吗?

背景:我在一个评论线程中两次感到惊讶(Benjamin Lindley 对 this question 的回答)。首先,来自 piotr 的评论:

Right shift on signed type is undefined behaviour

其次,来自 James Kanze 的评论:

when assigning to a long, if the value doesn't fit in a long, the results are implementation defined

在我相信它们之前,我必须在标准中查找这些。它们的唯一原因是适应非 2 的补码整数表示。为什么?

最佳答案

(编辑:C++20 现在强制使用 2 的补码表示,请注意,有符号算术的溢出仍未定义,并且在某些情况下移位继续具有未定义和实现定义的行为。)

  • 定义未定义的东西的一个主要问题是编译器是在假设未定义的情况下构建的。更改标准不会更改编译器,并且审查这些以找出假设的位置是一项艰巨的任务。

  • 即使在 2 补码机器上,您的品种也可能比您想象的要多。两个例子:有些没有符号保持右移,只有一个引入零的右移; DSP 的一个共同特点是饱和算法,分配一个超出范围的值会将其限制在最大值,而不仅仅是丢弃高位。

关于c++ - 为什么不在 C++ 中强制执行 2 的补码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5654159/

相关文章:

c++ - 作为成员变量的 Rapidjson 文档使该应用程序崩溃

ios - 十六进制(长字符串)l 到二进制

c++ - 为什么 C 或 C++ 标准不明确将 char 定义为有符号或无符号?

c++ - 编译器是否每次都实例化默认构造函数和复制构造函数以及复制赋值运算符?

c++ - Makefile 总是重新编译

Python:由 1 和 0 组成的字符串 -> 二进制文件

java - 将二进制 1 和 0 的整数(或字符串)数组转换为 Java 中的 alpha 等价物

java - SQLiteOpenHelper 方法应该接受对象或 ID 吗?

c - C编译器中是否有 Debug模式编译标志的标准?

c++ - MFC Visual Studio 中的代码错误 CString?