如何检查 int 变量是否包含合法(非陷阱表示)值?
How to check whether an int variable contains a legal (not trap representation) value?
>上下文:
这主要是对另一个问题的后续行动。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。 — 尾注 ]
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何将ampl中的集合表示为c++中的向量
- std::is_base_of表示ctor编译错误
- 输入中的字符串数未知(以字母表示)
- 我可以信任表示整数的浮点或双精度来保持精度吗
- c++模板来表示多项式
- 询问在设计我的手臂模拟器功能表示格式1
- CMakeLists.txt中的命名空间表示法
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 如何计算Big-O表示法中的平均渐近运行时间
- 我应该如何表示我拥有的连续元素序列?
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 表示类模板C++空类型
- 具有所表示类的相同构造函数签名的代理类模板
- 嵌套在循环中的两个循环的 big-O 表示法
- 具有引用成员的结构是否具有唯一的对象表示形式
- 使用 int 表示浮点除法 C++
- 如何检查 int 变量是否包含合法(非陷阱表示)值?
- 陷阱表示