通过示例的对象和值表示之间的差异

6 c++ memory language-lawyer

N3797::3.9/4 [basic.types] :

类型T的对象的对象表示是由类型T的对象占据的N个无符号字符对象的序列,其中N等于sizeof(T).对象的值表示是保存类型T的值的位集.对于简单的可复制类型,值表示是对象表示中的一组位,用于确定值,该值是实现的一个离散元素 -定义的值集

N3797::3.9.1 [basic.fundamental] 说:

对于窄字符类型,对象表示的所有位都参与值表示.

考虑以下结构:

struct A
{
    char a;
    int b;
}
Run Code Online (Sandbox Code Playgroud)

我认为,A由于实现添加了填充,因此对象表示的所有位都不参与值表示.但其他基本类型呢?标准说: N3797::3.9.1 [basic.fundamental]

对于窄字符类型,对象表示的所有位都参与值表示.这些要求不适用于其他类型.

我无法想象为什么它不适合说intlong.什么原因?你能澄清一下吗?

Jam*_*nze 6

一个例子可能是Unisys大型机,其中a int有48位,但只有40位参与值表示(并且INT_MAX是2 ^ 39-1); 其他的必须是0.我想任何具有标记架构的机器都会有类似的问题.

编辑:

只是一些进一步的信息:Unisys大型机可能是唯一真正具有异国情调的架构:Unisys Libra(前Burroughs)有48位字,使用带符号的整数,并且有一个标记架构,数据本身包含有关其类型的信息.Unisys Dorado是前Univac:36位的补码(但没有用于标记的保留位)和9位char.

然而,根据我的理解,Unisys正在逐步淘汰它们(或者在去年逐步淘汰它们),转而采用基于英特尔的系统.一旦它们消失,几乎所有系统都将是2的补码,32或64位,除了IBM大型机之外的所有系统都将使用IEEE浮点(并且IBM正在移动或已经朝这个方向发展).因此,标准没有任何动力继续采用特殊措辞来支持它们; 最后,在lesat的几年内,C/C++可能会遵循Java路径,并对其所有基本数据类型强制表示.