如何检查一个 int 变量是否包含一个合法的(不是陷阱表示)值?
How to check whether an int variable contains a legal (not trap representation) value?
上下文:
这主要是 that other question 的后续。 OP 想猜测一个变量是否包含一个 int,我的第一个想法是在 C 中(如在 C++ 中)一个 int 变量只能包含一个 int 值。 Eric Postpischil 提醒我,根据 int 类型的标准,陷阱表示 是允许的...
当然,我知道大多数现代系统只使用整数的 2 补码表示而没有填充位,这意味着无法观察到陷阱表示。尽管如此,这两个标准似乎仍然允许 3 种带符号类型的表示:符号和大小、一个补码和两个补码。并且至少 C18 草案(n2310 6.2.6 类型的表示)明确允许除 char.
以外的整数类型的填充位
问题
因此,在可能的填充位或非二进制补码符号表示的上下文中,int
变量可能包含一致性实现的陷阱值。有没有可靠的方法来确保 int 变量包含有效值?
在 C++ 当前的工作草案中(对于 C++20),整数不能有陷阱表示。整数必须作为二进制补码:([basic.fundamental]/3)
An unsigned integer type has the same object representation, value representation, and alignment requirements ([basic.align]) as the corresponding signed integer type.
For each value x of a signed integer type, the value of the corresponding unsigned integer type congruent to x modulo 2N has the same value of corresponding bits in its value representation. 41
[ Example: The value −1 of a signed integer type has the same representation as the largest value of the corresponding unsigned type.
— end example
]
注释 41 说的地方
This is also known as two's complement representation.
这已在 p0907 中更改。
此外,整数中的填充位不会导致陷阱:([basic.fundamental/4])
Each set of values for any padding bits ([basic.types]) in the object representation are alternative representations of the value specified by the value representation.
[ Note: Padding bits have unspecified value, but do not cause traps.
See also ISO C 6.2.6.2.
— end note
]
上下文:
这主要是 that other question 的后续。 OP 想猜测一个变量是否包含一个 int,我的第一个想法是在 C 中(如在 C++ 中)一个 int 变量只能包含一个 int 值。 Eric Postpischil 提醒我,根据 int 类型的标准,陷阱表示 是允许的...
当然,我知道大多数现代系统只使用整数的 2 补码表示而没有填充位,这意味着无法观察到陷阱表示。尽管如此,这两个标准似乎仍然允许 3 种带符号类型的表示:符号和大小、一个补码和两个补码。并且至少 C18 草案(n2310 6.2.6 类型的表示)明确允许除 char.
以外的整数类型的填充位问题
因此,在可能的填充位或非二进制补码符号表示的上下文中,int
变量可能包含一致性实现的陷阱值。有没有可靠的方法来确保 int 变量包含有效值?
在 C++ 当前的工作草案中(对于 C++20),整数不能有陷阱表示。整数必须作为二进制补码:([basic.fundamental]/3)
An unsigned integer type has the same object representation, value representation, and alignment requirements ([basic.align]) as the corresponding signed integer type. For each value x of a signed integer type, the value of the corresponding unsigned integer type congruent to x modulo 2N has the same value of corresponding bits in its value representation. 41 [ Example: The value −1 of a signed integer type has the same representation as the largest value of the corresponding unsigned type. — end example ]
注释 41 说的地方
This is also known as two's complement representation.
这已在 p0907 中更改。
此外,整数中的填充位不会导致陷阱:([basic.fundamental/4])
Each set of values for any padding bits ([basic.types]) in the object representation are alternative representations of the value specified by the value representation. [ Note: Padding bits have unspecified value, but do not cause traps. See also ISO C 6.2.6.2. — end note ]