12

[C++11: 1.7]用位来讨论字节

C++ 内存模型中的基本存储单元是字节。一个字节至少大到足以包含基本执行字符集 (2.3) 的任何成员和 Unicode UTF-8 编码形式的八位代码单元,并且由连续的位序列组成,其数量为实现定义。最低有效位称为低位;最高有效位称为高位。C++ 程序可用的内存由一个或多个连续字节序列组成。每个字节都有一个唯一的地址。

但是,我在定义“位”的标准中找不到任何地方。

那么说 C++ 对单个位可以表示的值的数量没有限制是真的吗?

例如,它是否允许三态位?

4

3 回答 3

6

列出的规范性参考资料包括[C++11: 1.2]“ISO/IEC 9899:1999,编程语言 — C”。

反过来,这个标准说:

[C99: 3.5]: 执行环境中的1位数据存储单元,大到足以容纳可能具有两个值之一的对象

这并不排除位是更大的数据存储单元,因此 C++ 作为一种语言确实可以支持三态位。

于 2012-09-29T19:41:43.610 回答
2

3.9.1.7 说

bool、char、wchar_t 类型以及有符号和无符号整数类型统称为整数类型。48) 整数类型的同义词是整数类型。整数类型的表示应使用纯二进制计数系统定义值。49) [ 示例:本国际标准允许整数类型的 2 的补码、1 的补码和带符号的幅度表示。—结束示例]"

笔记上49写着

整数的位置表示,它使用二进制数字 0 和 1,其中由连续位表示的值是相加的,从 1 开始,并乘以 2 的连续整数幂,可能最高位置的位除外。(改编自美国国家信息处理系统词典。)

于 2012-09-29T20:15:45.100 回答
1

我不同意接受的答案,因为这可以由三元机器模拟,这是规范明确允许的。

§ 3.9.1/4 声明为无符号的无符号整数应遵守算术模 2 n的定律,其中 n 是该特定整数大小的值表示中的位数。
§ 1.8/5 普通可复制或标准布局类型 (3.9) 的对象应占用连续的存储字节。
§ 3.9/9 算术类型 (3.9.1)... 统称为标量类型。标量类型,...此类类型的数组...统称为 POD 类型。标量类型...,此类类型的数组...统称为普通可复制类型。
§ 3.8/2 对于任何可简单复制类型的对象... T,无论该对象是否持有类型的有效值T,构成该对象的底层字节都可以复制到一个数组中charunsigned char. char如果or的数组的内容unsigned char被复制回对象,则该对象随后应保持其原始值。

这里的问题是,在所有点上,所有可简单复制的多字节对象的状态都必须可复制到数组char并返回而不会丢失。这意味着模拟 base 2 机器的三元机器(如具有模“翻转”的基本算术类型所要求的那样),必须在每个无符号多字节算术运算中模拟从每个模拟字节到下一个字节的翻转。

即使这在三元机器上也可以缓慢地模拟,但是如果所有原始类型都由恰好 41 个三元组组成,那么编译器所需要担心的就是无符号翻转/欠压,这可能是可行的。(显然,模拟^,|并且&也很慢,但在我看来这不是一个问题)我认为可以做到,但是为三元机器制作符合标准的 C++ 编译器是非常不切实际的。

于 2013-01-04T23:29:17.820 回答