c++20 中是否有整数数据类型的标准二进制表示?

Is there a standard binary representation of integer data types in c++20?

我知道在 c++20 中,符号幅度和 one's comp 最终被淘汰,以支持标准化 two's comp。 (参见 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0907r3.html, and http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1236r1.html)我想知道这意味着我们现在可以在 C++20 中对整数的二进制表示做出多少假设?在我阅读它时,似乎已经在允许的范围内进行了很多思考,但我没有看到任何真正表明对位布局或字节序的要求的内容。因此,我认为字节顺序仍然是一个问题,但是位布局呢?

根据标准,0b00000001 == 1 对于 int8_t 是否总是正确的? 0b11111111 == -1

我知道在几乎所有实际系统上,最左边的位将是最重要的,逐渐减少直到到达最右边和最不重要的字节,我测试过的所有系统似乎都使用这种表示,但是标准是否对此以及我们得到的任何保证有任何说明?或者如果我们需要知道底层表示而不是依赖于此,使用 256 元素查找 table 将一个字节可以表示的每个值显式映射到特定位表示会更安全吗?如果我可以按原样直接使用字节,我宁愿不接受查找的性能损失,但我也想确保我的代码没有做出太多假设,因为可移植性很重要。

C++20 标准requires that signed integers work as follows:

For each value x of a signed integer type, the value of the corresponding unsigned integer type congruent to x modulo 2N has the same value of corresponding bits in its value representation.

这就是二进制补码的定义方式(甚至有一个脚注告诉您这是什么意思)。这不允许符号位出现在任何地方 除了 有符号整数值表示中的最高位。并且这不允许转换为无符号等价物以将该位移动到无符号等价物的值表示中最高位以外的任何位置。

two's complement 表示二进制补码。

according to the standard, is 0b00000001 == 1 always true for an int8_t? What about 0b11111111 == -1

在表示方面,自 C++11 以来就是如此。这是因为特定大小的有符号整数类型 总是 需要是二进制补码(即使 signed char 不是)。当然,这些类型只是可选地支持,所以如果你想要最大的可移植性,你不能依赖它们。

要求符号位是最高有效位(§[basic.fundamental]/3):

For each value x of a signed integer type, the value of the corresponding unsigned integer type congruent to x modulo 2N has the same value of corresponding bits in its value representation.

如果符号位是无符号中的 MSB,事情只会以这种方式工作。

这还要求(例如)uint8_t x = -1;x 设置为 0b11111111(因为 -1 减少模 28 是255).事实上,这在标准中用作示例:

[Example: The value −1 of a signed integer type has the same representation as the largest value of the corresponding unsigned type. —end example]

就偏移表示而言,我认为它被认为是不可能的。 C++标准是指C标准要求(§6.2.6.2/1):

If there are N value bits, each bit shall represent a different power of 2 between 1 and 2N-1, so that objects of that type shall be capable of representing values from 0 to 2N - 1 using a pure binary representation;

“使用纯二进制表示”至少通常被解释为这样的表示:

bNbN-1bN-2...b2b1b0.

即,如果您从 0 到 N-1 计算位,则每个位代表 2 的相应幂。