如何检查 int 变量是否包含合法(非陷阱表示)值?

How to check whether an int variable contains a legal (not trap representation) value?

本文关键字:陷阱 表示 是否 何检查 检查 int 变量 包含      更新时间:2023-10-16

>上下文:

这主要是对另一个问题的后续行动。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。 — 尾注 ]