整数类型的值表示是实现定义的还是未指定的?
Is the value representation of integral types implementation-defined or unspecified?
引自N4868 6.8.2第5段:
Each value x of an unsigned integer type with width N has a unique representation...
值得注意的是,它避免指定“值表示”或“对象表示”,因此不清楚此处是否有意。
稍后(在实现定义的行为的索引中),N4868 确实将指针和浮点类型的值表示称为实现定义的,但非常明显地排除了整数类型。
鉴于此,我可以想到四种可能的解释:
- 整数类型的值表示是唯一指定的
- 整数类型的值表示未指定
- 整数类型的值表示是实现定义的,但被错误地排除在上述索引之外
- 整数类型的值表示未定义
#1 似乎是不可能的,因为大端和小端架构都存在实现。
#3 似乎不太可能,因为索引中缺少整数类型是很明显的,而且浮点和指针类型的实际文本表明它们是实现定义的,而整数类型的文本转到避免指定值表示的长篇大论。
#2 是最有可能的解释,但值得注意的是,标准经常将行为称为未指定行为,但这里没有这样说。这意味着,即使 实际上没有这样调用 ,行为也可以是未指定的,这使得很难区分仅未指定的行为与标准未定义的行为根本没有定义它(而不是称为“未定义的行为”)
#4 似乎很荒谬,因为该标准暗示所有类型(或至少是可平凡复制的类型)都有明确的(如果未指定的话)对象表示(以及扩展的值表示)。具体来说,6.7 第 4 段指出:
For trivially copyable types, the value representation is a set of bits in the object representation
that determines a value, which is one discrete element of an implementation-defined set of values.
这似乎暗示平凡可复制类型(包括整数类型)的值表示在其他方面未指定。
场景 #2 可能表明无法将表示称为“未指定”,因为我们在第 3 节中的“未定义行为”定义下有注释:“当本文档省略任何内容时,可能会出现未定义的行为行为的明确定义。”如果整数类型的值表示不是每个都明确声明为未指定/实现定义,那么依赖于值表示的代码将不仅仅是未指定/实现定义的,它将是 undefined 遗漏。
然而,也有人可能会争辩说“行为的明确定义”条款不适用,因为行为是完全明确定义的,对象表示是 unsigned char
类型的对象序列,其中仅将它们的值留给实施。
将其作为编辑问题提出后,正确答案似乎是整数表示是“上述的 none”。它只是未指定,也没有这样称呼,因为“未指定”标签通常仅适用于行为。
引自N4868 6.8.2第5段:
Each value x of an unsigned integer type with width N has a unique representation...
值得注意的是,它避免指定“值表示”或“对象表示”,因此不清楚此处是否有意。
稍后(在实现定义的行为的索引中),N4868 确实将指针和浮点类型的值表示称为实现定义的,但非常明显地排除了整数类型。
鉴于此,我可以想到四种可能的解释:
- 整数类型的值表示是唯一指定的
- 整数类型的值表示未指定
- 整数类型的值表示是实现定义的,但被错误地排除在上述索引之外
- 整数类型的值表示未定义
#1 似乎是不可能的,因为大端和小端架构都存在实现。
#3 似乎不太可能,因为索引中缺少整数类型是很明显的,而且浮点和指针类型的实际文本表明它们是实现定义的,而整数类型的文本转到避免指定值表示的长篇大论。
#2 是最有可能的解释,但值得注意的是,标准经常将行为称为未指定行为,但这里没有这样说。这意味着,即使 实际上没有这样调用 ,行为也可以是未指定的,这使得很难区分仅未指定的行为与标准未定义的行为根本没有定义它(而不是称为“未定义的行为”)
#4 似乎很荒谬,因为该标准暗示所有类型(或至少是可平凡复制的类型)都有明确的(如果未指定的话)对象表示(以及扩展的值表示)。具体来说,6.7 第 4 段指出:
For trivially copyable types, the value representation is a set of bits in the object representation that determines a value, which is one discrete element of an implementation-defined set of values.
这似乎暗示平凡可复制类型(包括整数类型)的值表示在其他方面未指定。
场景 #2 可能表明无法将表示称为“未指定”,因为我们在第 3 节中的“未定义行为”定义下有注释:“当本文档省略任何内容时,可能会出现未定义的行为行为的明确定义。”如果整数类型的值表示不是每个都明确声明为未指定/实现定义,那么依赖于值表示的代码将不仅仅是未指定/实现定义的,它将是 undefined 遗漏。
然而,也有人可能会争辩说“行为的明确定义”条款不适用,因为行为是完全明确定义的,对象表示是 unsigned char
类型的对象序列,其中仅将它们的值留给实施。
将其作为编辑问题提出后,正确答案似乎是整数表示是“上述的 none”。它只是未指定,也没有这样称呼,因为“未指定”标签通常仅适用于行为。