![](/img/trans.png)
[英]Why is operator!= removed in C++20 for many standard library types?
[英]Is there a standard binary representation of integer data types in c++20?
我知道在 c++20 中,sign magnitude 和 one's comp 最终被淘汰,取而代之的是标准化 two's comp。 (参见http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0907r3.html和http://www.open-std.org/jtc1/sc22/wg21/docs /papers/2018/p1236r1.html )我想知道这意味着我们现在可以在 C++20 中对整数的二进制表示做出多少假设? 在我阅读它时,似乎已经在允许的范围内进行了很多思考,但我没有看到任何真正表明对位布局或字节序的要求的内容。 因此,我认为字节顺序仍然是一个问题,但是位布局呢?
根据标准, 0b00000001 == 1
对于 int8_t 总是正确的吗? 0b11111111 == -1
怎么样
我知道在几乎所有实际系统上,最左边的位将是最重要的,逐渐减少直到达到最右边和最不重要的字节,我测试过的所有系统似乎都使用这种表示,但标准说关于这件事和我们得到的任何保证吗? 或者如果我们需要知道底层表示而不是依赖它,那么使用一个 256 元素查找表到 map 每个值一个字节可以明确表示为特定位表示会更安全吗? 如果我可以按原样直接使用字节,我宁愿不接受查找的性能损失,但我也想确保我的代码没有做出太多假设,因为可移植性很重要。
C++20 标准要求有符号整数按如下方式工作:
对于每个带符号 integer 类型的值
x
,对应的无符号 integer 类型的值与x
模 2 N一致,在其值表示中具有相同的对应位值。
这就是二进制补码的定义方式(甚至有一个脚注告诉您这就是它的意思)。 这不允许符号位出现在带符号 integer 的值表示中最高位以外的任何位置。并且这不允许转换为无符号等效项以将该位移动到值表示中最高位以外的任何位置无符号等价物。
two's complement 表示二进制的补码。
根据标准,0b00000001 == 1 对于 int8_t 总是正确的吗? 0b11111111 == -1 怎么样
就表示而言,自 C++11 以来一直如此。这是因为特定大小的带符号 integer 类型始终需要为二进制补码(即使signed char
不是)。 当然,这些类型只是可选的支持,所以如果你想要最大的可移植性,你不能依赖它们。
符号位必须是最高有效位 (§[basic.fundamental]/3):
对于每个带符号 integer 类型的值 x,对应的无符号 integer 类型的值与 x 模 2 N一致,在其值表示中具有相同的对应位值。
如果符号位是无符号中的 MSB,事情只会以这种方式工作。
这也要求(例如) uint8_t x = -1;
会将x
设置为0b11111111
(因为 -1 减少模 2 8是 255)。 事实上,这在标准中用作示例:
[示例:有符号 integer 类型的值 −1 与相应无符号类型的最大值具有相同的表示形式。 ——结束例子]
就偏移表示而言,我认为这被认为是不可能的。 C++ 标准指的是 C 标准,它要求 (§6.2.6.2/1):
如果有 N 个值位,则每个位应表示 1 和 2 N-1之间的 2 的不同幂,以便该类型的对象应能够使用纯二进制表示法表示从 0 到 2 N - 1的值;
“使用纯二进制表示”至少通常被解释为表示如下的表示:
b N b N-1 b N-2 ... b 2 b 1 b 0 。
也就是说,如果您从 0 到 N-1 计算位,则每个位代表 2 的相应幂。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.