我不同意接受的答案,因为这可以由三元机器模拟,这是规范明确允许的。
§ 3.9.1/4 声明为无符号的无符号整数应遵守算术模 2 n的定律,其中 n 是该特定整数大小的值表示中的位数。
§ 1.8/5 普通可复制或标准布局类型 (3.9) 的对象应占用连续的存储字节。
§ 3.9/9 算术类型 (3.9.1)... 统称为标量类型。标量类型,...此类类型的数组...统称为 POD 类型。标量类型...,此类类型的数组...统称为普通可复制类型。
§ 3.8/2 对于任何可简单复制类型的对象... T
,无论该对象是否持有类型的有效值T
,构成该对象的底层字节都可以复制到一个数组中char
或unsigned char
. char
如果or的数组的内容unsigned char
被复制回对象,则该对象随后应保持其原始值。
这里的问题是,在所有点上,所有可简单复制的多字节对象的状态都必须可复制到数组char
并返回而不会丢失。这意味着模拟 base 2 机器的三元机器(如具有模“翻转”的基本算术类型所要求的那样),必须在每个无符号多字节算术运算中模拟从每个模拟字节到下一个字节的翻转。
即使这在三元机器上也可以缓慢地模拟,但是如果所有原始类型都由恰好 41 个三元组组成,那么编译器所需要担心的就是无符号翻转/欠压,这可能是可行的。(显然,模拟^
,|
并且&
也很慢,但在我看来这不是一个问题)我认为可以做到,但是为三元机器制作符合标准的 C++ 编译器是非常不切实际的。