C99 标准第 6.2.6.1 8 节规定:
When an operator is applied to a value that has more than one object representation, which object representation is used shall not affect the value of the result (43). Where a value is stored in an object using a type that has more than one object representation for that value, it is unspecified which representation is used, but a trap representation shall not be generated.
我将 object 理解为内存中的一个位置(字节),并将值作为基于用于访问它的类型对这些字节的解释。如果是这样,那么:
该标准在脚注中增加了以下内容:
不过,我还不清楚。有人可以为我简化它并用例子解释吗?
最佳答案
对象是一个存储区域(内存),可以包含某种类型的值 [C18 3.15]。
对象表示是构成对象内容的字节 [C18 6.2.6.1]。
并非对象表示中所有可能的字节组合也必须对应于类型的值(不对应的对象表示称为陷阱表示 [C18 3.19.4])。
并不是对象表示中的所有位都必须参与表示一个值。考虑以下类型:
struct A
{
char c;
int n;
};
允许编译器(并且通常会)在该结构的成员
c
和 n
之间插入填充字节,以确保 n
的正确对齐。这些填充字节是 struct A
类型对象的一部分。因此,它们是对象表示的一部分。但是这些填充字节的值对存储在对象中的 A
类型的逻辑值没有任何影响。假设我们在一个目标平台上,其中字节由 8 位组成,
int
由 4 个字节以小端顺序组成,并且在 c
和 n
之间有 3 个填充字节以确保 n
以倍数的偏移量开始4. (struct A){42, 1}
值可以存储在一个对象中2A 00 00 00 01 00 00 00
但它也可以存储在一个对象中
2A FF FF FF 01 00 00 00
或其他任何填充字节可能碰巧是。这些字节序列中的每一个都是
struct A
类型的相同逻辑值的有效对象表示。这也是脚注的内容。如果您有两个对象
x
和 y
,每个对象都包含相同类型 struct A
的不同对象表示,那么 x == y
将评估为 true 而简单地执行 memcmp()
不会,因为 memcmp()
只是比较对象表示的字节而不考虑作为存储在这些对象中的逻辑值实际上是什么......
关于C 中的类型可以有多个对象表示吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59134158/