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

Ton*_*nyK 26 c++ binary standards

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

背景:我在一个评论帖中惊讶两次(Benjamin Lindley对这个问题的回答).首先,来自piotr的评论:

签名类型的右移是未定义的行为

其次,来自James Kanze的评论:

当分配给long时,如果该值不适合long,则结果是实现定义的

在我相信之前,我必须在标准中查看这些内容.它们的唯一原因是适应非二进制补码整数表示.为什么?

APr*_*mer 23

  • 定义不合适的东西的一个主要问题是编译器是在未定义的情况下构建的.改变标准不会改变编译器并审查那些编制者以找出假设的位置是一项艰巨的任务.

  • 即使在2补充机器上,您可能比您想象的更多样化.两个例子:一些没有保持右移的符号,只有一个引入零的右移; DSP中的一个共同特征是饱和算术,指定超出范围值会将其限制为最大值,而不仅仅是丢弃高位.

  • +1,解释了为什么OP的说法“它们的唯一原因是容纳非2的补码”是错误的,这可能是这个问题最接近明确答案的,即使它只是补充背景: -) (2认同)

Cub*_*bbi 5

我想这是因为标准说,3.9.1[basic.fundamental]/7

\n\n
\n

该国际标准允许整数类型的 2\xe2\x80\x99s 补码、1\xe2\x80\x99s 补码和带符号的幅度表示。

\n
\n\n

我敢打赌,它来自 C 编程语言,其中列出了符号和大小补码补码作为 中唯一允许的表示形式6.2.6.2/2。当 C 广泛传播时,肯定存在 1 的补码系统:UNIVAC 似乎是最常被提及的。

\n

  • @Bo:该标准确实禁止特定类型的硬件,或者更确切地说,它要求它们的 C++ 实现像其他类型的硬件一样运行,即使这样做效率低下。如果我想在我的 C++ 实现中使用 8 位超过 127 字节,那么我就不走运了,标准禁止这样做。 (3认同)