新的 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/