Ser*_*sta 6 c++ integer data-representation language-lawyer bit-representation
这主要是对另一个问题的跟进。OP 想猜测一个变量是否包含一个 int 值,我的第一个想法是在 C 中(如在 C++ 中)一个 int 变量只能包含一个 int 值。Eric Postpischil 提醒我,对于 int 类型,每个标准都允许使用陷阱表示......
当然,我知道大多数现代系统只使用整数的 2 补码表示,没有填充位,这意味着无法观察到陷阱表示。尽管如此,这两个标准似乎仍然允许有符号类型的 3 种表示形式:符号和幅度、一个补码和二进制补码。并且至少 C18 草案(n2310 6.2.6 类型表示)明确允许填充除字符以外的整数类型的位。
因此,在可能的填充位或非二进制补码符号表示的上下文中,int变量可能包含符合实现的陷阱值。有没有可靠的方法来确保 int 变量包含有效值?
在 C++ 的当前工作草案(针对 C++20)中,整数不能有陷阱表示。整数被强制为二进制补码:([basic.fundamental]/3)
无符号整数类型与相应的有符号整数类型具有相同的对象表示、值表示和对齐要求([basic.align])。对于有符号整数类型的每个值 x,与 x 模 2N 一致的相应无符号整数类型的值在其值表示中具有相同的相应位值。41 [ 示例:有符号整数类型的值?1 与相应无符号类型的最大值具有相同的表示形式。— 结束示例 ]
注释 41 说的地方
这也称为二进制补码表示。
这已在p0907中更改。
此外,整数中的填充位不会导致陷阱:([basic.fundamental/4])
对象表示中任何填充位 ([basic.types]) 的每组值都是由值表示指定的值的替代表示。[ 注意:填充位具有未指定的值,但不会导致陷阱。另见 ISO C 6.2.6.2。— 尾注 ]